임베디드 (따옴표 붙은) JSON 문자열을 JSON으로 변환하는 방법


22

json 구문 분석에 대한 "jq"에 익숙합니다.

속성 중 하나가 json 문자열 인 json 응답을 생성하는 하나의 서비스로 작업합니다. 인용 된 값을 유효한 json 문자열로 변환하여 jq로 처리하려면 어떻게해야합니까?

예를 들어, "jq"에서 꽤 인쇄 된 일반 json을 보면 출력에 대한 짧은 발췌문이 있습니다.

"someJsonString": "{\"date\":\"2018-01-08\", ...

jq를 사용하여 해당 속성의 값을 얻을 수 있지만 인용 된 문자열을 "unscaping"하여 유효한 json으로 변환해야합니다.

sed에 파이프를 연결하고 여는 큰 따옴표와 끝 큰 따옴표를 제거하고 모든 백 슬래시 ( " sed -e 's/^"//' -e 's/"$//' -e 's/\\//g'")를 제거 할 수 있다고 가정합니다 . 그것은 효과가있는 것처럼 보이지만 가장 강력한 솔루션처럼 보이지는 않습니다.

업데이트 :

내가하고있는 일을 조금 더 명확하게하기 위해 내가 시도한 것을 보여주는 몇 가지 생략 된 샘플이 있습니다.

% curl -s -q -L 'http://.../1524.json' | jq '.results[0].someJsonString' | jq .
"{\"date\":\"2018-01-08\",...
% echo $(curl -s -q -L 'http:/.../1524.json' | jq '.results[0].someJsonString') | jq .
"{\"date\":\"2018-01-08\",...

업데이트 :

완전히 독립된 예는 다음과 같습니다.

% cat stuff.json | jq .
{
  "stuff": "{\"date\":\"2018-01-08\"}"
}
% cat stuff.json | jq '.stuff'
"{\"date\":\"2018-01-08\"}"
% cat stuff.json | jq '.stuff' | jq .
"{\"date\":\"2018-01-08\"}"

업데이트 :

실제 jq 표현식으로 마지막 출력을 처리하려고하면 다음과 같이됩니다.

% cat stuff.json | jq '.stuff' | jq '.date'
assertion "cb == jq_util_input_next_input_cb" failed: file "/usr/src/ports/jq/jq-1.5-3.x86_64/src/jq-1.5/util.c", line 371, function: jq_util_input_get_position
Aborted (core dumped)

당신이 사용하는 경우 jq얻을 단지 문자열 속성 값을, 그것이 이스케이프 반환하지? 그렇다면 신선한 것으로 파이프하십시오 jq.
DopeGhoti

아니요, 이스케이프 처리되지 않은 상태로 반환하지 않습니다. 그게 요점입니다.
David M. Karr

어때요 echo $(jq statement here)?
DopeGhoti

아니, 변화가 없어
David M. Karr

@ DavidM.Karr, 가능하다면 가능하다면 실제 중요한 문자열과 최종 결과로 입력을 확장하십시오
RomanPerekhrest

답변:


20

이것에 대한 raw깃발이 있습니다

    -r      output raw strings, not JSON texts;

jq -rc .stuff stuff.json

산출

{"date":"2018-01-08"}

차이점은 Roman의 대답으로 유효한 JSON 출력 또는 유효한 JSON이 아닌 경우 오류 메시지를 얻을 수 있다는 것입니다.
Kusalananda

유효한 포인트이지만 이것이 자동화에 사용되는 경우 갑자기 유효한 json 출력이없는 것은 드문 일이라고 생각합니다. 가장 편리한 형태는 거의 항상 완벽하게 괜찮습니다. 그러나 더 정확한 방법에 대해 아는 것이 여전히 좋습니다.
David M. Karr

@ DavidM.Karr "정상적으로 유효한 JSON 출력을 갖지 못하는 비정상적인"HA! Riiiight. 자동화 오류 처리? 오류가 발생 하지 않습니다 ! 왜 귀찮게!
Bruno Bronosky

이를 위해서는 jq추가 JSON 처리 를 위해 다른 파이프로 파이핑해야 하지만 Roman의 접근 방식으로 동일한 jq표현을 계속할 수 있습니다 .
라만

1
@ cricket_007가 : JQ 1.5 그것을 시도, 그것이 작동하지 않습니다 확인 : jq -rc '.stuff.date'생산 jq: error (at <stdin>:0): Cannot index string with string "date". 그러나 .stuff | fromjson | .date잘 작동합니다.
Raman

26

으로 jqfromjson기능 :

샘플 stuff.json내용 :

{
  "stuff": "{\"date\":\"2018-01-08\"}"
}

jq -c '.stuff | fromjson' stuff.json

출력 :

{"date":"2018-01-08"}

이것은 불필요하게 보인다. 대체 답변 제공
cricket_007
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.