임베디드 (따옴표 붙은) 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

으로 jq의 fromjson기능 :

샘플 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.