使用jq解析JSON字符串


87

我试图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

Answers:


164

jq具有fromjson内置功能:

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

fromjson 是在1.4版中添加的。


2
谢谢。这有效。我会接受这个答案,因为我觉得这更像“惯用语”。干杯。
Colin Grogan

请@ColinGrogan。
vbence

@ColinGrogan:我看不出有任何理由来更改已接受的答案,因为您清楚地在问题中写道,您使用的jq版本为1.3,该fromjson功能不可用。换句话说,即使这个答案很有趣,也不会回答这个问题。
卡西米尔(Casimir)和希波吕特(Hippolyte),

是否可以在整个json文件上使用此功能(不指定.id属性)?
Florian Castelain

1
@FlorianCastelain是的,可以将其忽略或使用dot jq 'fromjson | .' myfile"{\"key\":1, \"word\":\"cat\"}"

41

您可以使用原始输出(-r)取消转义字符:

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

附录:它的优点是可以在jq 1.3及更高版本中使用;实际上,它应该在具有-r选项的每个jq版本中都可以使用。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.