私はjsonを解析するために「jq」に精通しています。
属性の1つがjson文字列であるjson応答を生成するサービスを使用します。 jqを使用して処理できるように、その参照値を有効なjson文字列に変換するにはどうすればよいですか?
たとえば、「jq.」で単純に印刷されたjsonを見た場合、出力の短い抜粋は次のようになります。
"someJsonString": "{\"date\":\"2018-01-08\", ...
jqを使用して属性値を取得できますが、「unescape」で引用した文字列を有効な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)
答え1
jq
とともにfromjson
機能:
サンプルstuff.json
コンテンツ:
{
"stuff": "{\"date\":\"2018-01-08\"}"
}
jq -c '.stuff | fromjson' stuff.json
出力:
{"date":"2018-01-08"}
答え2
raw
これにフラグがあります。
-r output raw strings, not JSON texts;
jq -rc .stuff stuff.json
出力
{"date":"2018-01-08"}