jq를 사용하여 JSON 문자열 구문 분석


87

다음 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할 수 있는 방법이 있다고 가정 합니다.

감사!

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

$ jq --version
jq version 1.3

필요한 경우 업데이트 할 수있을 것 같습니다.


이 질문은 "jq를 사용하여 json 문자열을 이스케이프 해제하는 방법"을 찾는 경우에도 도움이됩니다.
k0pernikus

답변:


164

jq에는이를위한 fromjson내장 기능이 있습니다.

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

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


2
감사합니다. 작동합니다. 이 대답은 내가 느끼는 '특이한'것이기 때문에 받아 들일 것입니다. 건배.
Colin Grogan

@ColinGrogan 부탁드립니다.
vbence

@ColinGrogan :이 fromjson기능을 사용할 수없는 jq 1.3 버전을 사용했다고 질문에 명확하게 썼기 때문에 수락 된 답변을 변경할 이유 가 없습니다. 즉,이 답변이 흥미 롭다고해도 질문에 대한 답변이 아닙니다.
Casimir et Hippolyte

이것을 사용할 수 있지만 전체 json 파일 (.id 속성을 지정하지 않음)에서 사용할 수 있습니까?
Florian Castelain

1
@FlorianCastelain 예, 생략하거나 dot :을 사용합니다. jq 'fromjson | .' myfile여기서 myfile에는"{\"key\":1, \"word\":\"cat\"}"

41

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

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

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.