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


22

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)

文字列プロパティの値のみjqを取得するために使用する場合、エスケープせずに返しますか?もしそうなら、それを新鮮なパイプにパイプしてください。jq
DopeGhoti

いいえ、エスケープせずに返しません。それがポイントです。
デビッドM.カー

どうecho $(jq statement here)
-DopeGhoti

いいえ、変更なし。
デビッドM.カー

@ DavidM.Karr、OK、可能であれば-実際の重要な文字列と最終結果で入力を拡張します
-RomanPerekhrest

回答:


20

rawこのためのフラグがあります

    -r      output raw strings, not JSON texts;

jq -rc .stuff stuff.json

出力

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

違いは、Romanの答えでは、有効なJSON出力、または有効なJSONでない場合はエラーメッセージを取得することが保証されることです。
クサラナナンダ

有効なポイントですが、これが自動化で使用されている場合、有効なjson出力が突然ないことはまれだと思います。ほとんどの場合、最も便利なフォームは完全に問題ありません。ただし、より正確な方法について知ることはまだ良いことです。
デビッドM.カー

@ DavidM.Karr「突然、有効なjson出力を持たないという異常」HA!右。自動化でのエラー処理?エラーは発生しません!なぜわざわざ!
ブルーノブロノスキー

これにはjq、さらにJSON処理を行うために別のパイプが必要ですが、Romanのアプローチでは同じjq式を続けることができます。
ラマン

1
@ cricket_007:jq 1.5で試してみて、動作しないことを確認しました:jq -rc '.stuff.date'produces jq: error (at <stdin>:0): Cannot index string with string "date"。ただし、.stuff | fromjson | .date正常に動作します。
ラマン

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.