1. ホーム
  2. json

[解決済み] JSON文字列をjq(または他の選択肢)でパースする方法は?

2022-08-14 16:29:50

質問

私は jq のような JSON 構造をパースするようにします。

{
  "a" : 1,
  "b" : 2,
  "c" : "{\"id\":\"9ee ...\",\"parent\":\"abc...\"}\n"
}

つまり、JSONの要素はjsonをエスケープした文字列である。

ということで、以下のようなものがあります。 $ jq [.c] myFile.json | jq [.id]

でクラッシュしてしまいます。 jq: error: Cannot index string with string

これは、.cの出力が文字列であり、より多くのJSONではないからです。 どうすればjqにこの文字列をパースさせることができるのでしょうか?

私の最初の解決策は、sed を使ってすべてのエスケープ文字を置き換えることです ( \":\" , \",\"\" に組み込まれた方法があると思いますが、それは面倒です。 jq に組み込まれているのでしょうか?

ありがとうございます。

を編集します。 また、こちらで公開されているjqのバージョンは

$ jq --version
jq version 1.3

必要なら更新すればいいんだろうけど。

どのように解決するのですか?

jqは fromjson というビルトインがあります。

jq '.c | fromjson | .id' myFile.json

fromjson はバージョン 1.4 で追加されました。