jqを使用してJSON文字列を解析します


91

私は次の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を使用してjson文字列をエスケープ解除する方法」を探している場合にも役立ちます。
k0pernikus 2017年

回答:


172

jqにはfromjsonこのための組み込みがあります:

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

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


2
ありがとうございました。これは機能します。私が感じるより「イディオマイティック」なので、私はこの答えを受け入れます。乾杯。
Colin Grogan

@ColinGroganしてください。
vbence 2017年

@ColinGrogan:fromjson機能が利用できないバージョン1.3のjqを使用したことを質問に明確に書いたので、受け入れられた回答を変更する理由はわかりません。言い換えれば、この答えが面白いとしても、それは質問に答えません。
Casimir et Hippolyte

これを使用することは可能ですが、jsonファイル全体(.idプロパティを指定しない)で使用できますか?
FlorianCastelain19年

1
@FlorianCastelainはい、それを省略するか、ドットを使用してください:jq 'fromjson | .' myfile、myfileに含まれる場所"{\"key\":1, \"word\":\"cat\"}"

42

文字をエスケープ解除する生の出力(-r)を使用できます。

jq -r .c myfile.json | jq .id

補遺:これには、jq1.3以降で機能するという利点があります。実際、-rオプションを持つjqのすべてのバージョンで機能するはずです。

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