JSON의 모든 숫자를 따옴표로 묶습니다.

JSON의 모든 숫자를 따옴표로 묶습니다.

일부 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

다음은 다음을 기반으로 한 간단한 솔루션입니다.jtcUNIX 유틸리티:

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와 .falsenull

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"
}

관련 정보