web-dev-qa-db-ja.com

埋め込まれた(引用符で囲まれた)json文字列をjsonに変換する方法

私はjsonを解析するための「jq」に精通しています。

私は、プロパティの1つがそれ自体json文字列であるjson応答を生成する1つのサービスを使用しています。引用符で囲まれた値を有効なjson文字列に変換して、jqで処理できるようにするにはどうすればよいですか?

たとえば、 "jq。"のきれいに出力されたプレーンなjsonを表示した場合、出力の短い抜粋を次に示します。

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

Jqを使用してそのプロパティの値を取得できますが、引用符で囲まれた文字列を「エスケープ解除」して有効な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)
33
David M. Karr

これにはrawフラグがあります

    -r      output raw strings, not JSON texts;
jq -rc .stuff stuff.json

出力

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

jqの-​​fromjson関数の場合:

サンプル stuff.json内容:

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

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

出力:

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