programing

JSON 문자열을 jq(또는 다른 대체)로 해석하는 방법

iphone6s 2023. 3. 28. 21:19
반응형

JSON 문자열을 jq(또는 다른 대체)로 해석하는 방법

나는 그것을 얻으려고 노력하고 있다.jq다음과 같이 JSON 구조를 해석합니다.

{
  "a" : 1,
  "b" : 2,
  "c" : "{\"id\":\"9ee ...\",\"parent\":\"abc...\"}\n"
}

즉, JSON의 요소는 이스케이프된 json을 가진 문자열입니다.

그래서, 제가 가지고 있는 것은$ jq [.c] myFile.json | jq [.id]

하지만 그건...jq: error: Cannot index string with string

이는 .c의 출력이 문자열이지 더 많은 JSON이 아니기 때문입니다.이 문자열을 해석하기 위해 jq를 얻는 방법은 무엇입니까?

초기 해결책은 sed를 사용하여 모든 이스케이프 문자를 교체하는 것입니다.\":\",\",\"그리고.\") 하지만 그건 좀 지저분해요. 제 생각엔,jq이걸 하기 위해서요?

감사합니다!

edit: 또한 여기서 사용할 수 있는 jq 버전은 다음과 같습니다.

$ jq --version
jq version 1.3

필요하다면 업데이트 할 수 있을 것 같아요.

jq에는 다음과 같은 기능이 있습니다.

jq '.c | fromjson | .id' myFile.json

fromjson는 버전 1.4에서 추가되었습니다.

문자를 이스케이프 해제하는 원시 출력(-r)을 사용할 수 있습니다.

jq -r .c myfile.json | jq .id

ADDENDUM: 이것은 jq 1.3 이상에서 동작한다는 장점이 있습니다.실제로 -r 옵션이 있는 모든 버전의 jq에서 동작합니다.

동기: JSON 문자열을 해석하는 경우 - 따옴표로 둘러싸여 String 버퍼로 표시되는 JSON 개체를 이스케이프하여 유효한 JSON 개체로 변환합니다.예를 들어 다음과 같습니다.

일부 JSON 이스케이프되지 않은 문자열:

"{\"name\":\"John Doe\",\"position\":\"developer\"}"

예상되는 결과(JSON 객체):

{"name":"John Doe","position":"developer"}

솔루션:JSON 문자열을 이스케이프하여 유효한 JSON 개체로 변환하려면sed특정 문자를 제거/바꾸기 위해 regex 식을 사용합니다.

cat current_json.txt | sed -e 's/\\\"/\"/g' -e 's/^.//g' -e 's/.$//g'

s/\\\"/\"/g모든 백슬래시와 따옴표를 바꿉니다(\"따옴표로 묶음( )")

s/^.//g스트림의 첫 번째 문자를 문자 없음으로 대체

s/.$//g스트림의 마지막 문자를 문자 없음으로 바꾸기

언급URL : https://stackoverflow.com/questions/35154684/how-to-parse-a-json-string-with-jq-or-other-alternatives

반응형