일부 JSON 데이터에는 숫자 값이 포함되어 있습니다. 모든 숫자를 문자열로 변환하는 방법은 무엇입니까? (따옴표로 묶음)
예:
{
"id":1,
"customer":"user",
"plate":"BMT-216-A",
"country":"GB",
"amount":1000,
"pndNumber":20000,
"zoneNumber":4
}
되어야 한다
{
"id":"1",
"customer":"user",
"plate":"BMT-216-A",
"country":"GB",
"amount":"1000",
"pndNumber":"20000",
"zoneNumber":"4"
}
답변1
$ jq 'map_values(tostring)' file.json
{
"id": "1",
"customer": "user",
"plate": "BMT-216-A",
"country": "GB",
"amount": "1000",
"pndNumber": "20000",
"zoneNumber": "4"
}
새 파일로 리디렉션한 다음 원래 파일 이름으로 이동합니다.
비플랫 구조의 숫자를 문자열로 보다 철저하게 변환하려면 다음을 고려하세요.
jq '(..|select(type == "number")) |= tostring' file.json
그러면 주어진 문서의 모든 값을 재귀적으로 확인하고 번호를 선택합니다. 그런 다음 선택한 값을 문자열로 변환합니다. 기술적으로는 키도 확인하지만 JSON에서는 순수한 숫자가 될 수 없으므로 키가 선택되지 않습니다.
예:
$ jq . file.json
{
"a": {
"b": 1
},
"b": null,
"c": [
1,
2,
"hello",
4
]
}
$ jq '(..|select(type == "number")) |= tostring' file.json
{
"a": {
"b": "1"
},
"b": null,
"c": [
"1",
"2",
"hello",
"4"
]
}
달리 참조하려면 다음으로 null
변경하십시오 .select()
select(type == "number" or type == "null")
답변2
다음은 다음을 기반으로 한 간단한 솔루션입니다.jtc
UNIX 유틸리티:
bash $ jtc -w'<.*>D:' -eu echo '"{}"' \; file.json
{
"amount": "1000",
"country": "GB",
"customer": "user",
"id": "1",
"plate": "BMT-216-A",
"pndNumber": "20000",
"zoneNumber": "4"
}
bash $
변경 사항을 json 파일에 직접 적용하려면 -f
다음과 같이 스위치를 사용하십시오.
bash $ jtc -f -w'<.*>D:' -eu echo '"{}"' \; file.json
제안된 솔루션은 다음과 같이 임의의 구조화된 json에서 잘 작동합니다.
bash $ jtc -w'<.*>D:' -eu echo '"{}"' \; file.json
{
"amount": "1000",
"country": "GB",
"customer": "user",
"id": "1",
"plate": "BMT-216-A",
"pndNumber": "20000",
"sub": {
"subvalue": "123"
},
"zoneNumber": "4"
}
bash $
- null 값을 참조하려면 도보 경로를 추가하면 됩니다.
-w'<>n:'
- 부울 추가 보행 경로를 참조하려면
-w'<any>b:'
또한 반대 작업(모든 숫자 역참조)도 유사한 방식으로 쉽게 수행할 수 있습니다. 예를 들어 file.json
"인용"을 사용하여 모든 숫자를 역참조합니다.
bash $ jtc -w'<^\d+$>R:' -eu echo {-} \; file.json
{
"amount": 1000,
"country": "GB",
"customer": "user",
"id": 1,
"plate": "BMT-216-A",
"pndNumber": 20000,
"zoneNumber": 4
}
bash $
고쳐 쓰다: 최신 버전에서는 jtc
이제 템플릿과 네임스페이스를 구현합니다. 이렇게 하면 외부 셸을 호출할 필요가 없습니다.
bash $ jtc -w'<.*>D:' -u'<.*>D:<val>v' -T'"{val}"' file.json
{
"amount": "1000",
"country": "GB",
"customer": "user",
"id": "1",
"plate": "BMT-216-A",
"pndNumber": "20000",
"zoneNumber": "4"
}
jtc
사용자 설명서:https://github.com/ldn-softdev/jtc/blob/master/User%20Guide.md
답변3
perl -pe 's/("(?:\\.|[^"])*")|[^\s[\]{}:,"]+/$1||qq("$&")/ge' file.json
인용되지 않은 것과 인용되지 않은 것은 무엇이든 인용할 것입니다 . []{}:,whitespace
따라서 숫자 true
와 .false
null
perl -pe 's/("(?:\\.|[^"])*")|-?\d+(?:\.\d+)?(?:[eE][-+]?\d+)?/$1||qq("$&")/ge'
json 번호 사양과 일치하고 따옴표가 없는 내용은 구체적으로 인용됩니다.
근사치가 아닌 JSON 사양에 따라 정확하게 토큰화됩니다.
답변4
아래 방법을 시도해 보았는데 정말 효과가 좋습니다.
나는 그것을 줄이기 위해 내 수준에 도달하려고 두 번 파이프했습니다.
주문하다:
sed 's/[0-9]\{1,\},\?$/"&/g' filename |
sed '/[0-9]\{1,\}$/s/[0-9]\{1,\}/&"/g'|
sed '/[0-9]\{1,\},$/s/,$/"&/g`'
산출:
{
"id":"1",
"customer":"user",
"plate":"BMT-216-A",
"country":"GB",
"amount":"1000",
"pndNumber":"20000",
"zoneNumber":"4"
}