使用jq解析JSON字符串

Col*_*gan 56 string json escaping sed jq

我试图jq解析一个JSON结构,如:

{
  "a" : 1,
  "b" : 2,
  "c" : "{\"id\":\"9ee ...\",\"parent\":\"abc...\"}\n"
}
Run Code Online (Sandbox Code Playgroud)

也就是说,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
Run Code Online (Sandbox Code Playgroud)

我想我可以根据需要更新它.

jwo*_*der 109

jq有fromjson内置的:

jq '.c | fromjson | .id' myFile.json
Run Code Online (Sandbox Code Playgroud)

fromjson 在版本1.4中添加.

  • 谢谢.这有效.我会接受这个答案,因为我觉得这更像是"惯用的".干杯. (2认同)
  • 这应该标记为正确的答案. (2认同)
  • @FlorianCastelain是的,要么省略它,要么使用点:`jq'fromjson | .' myfile`,其中 myfile 包含 `"{\"key\":1, \"word\":\"cat\"}"` (2认同)

Cas*_*yte 32

您可以使用将忽略字符的原始输出(-r):

jq -r .c myfile.json | jq .id
Run Code Online (Sandbox Code Playgroud)

ADDENDUM:这有一个优点,它适用于jq 1.3及以上版本; 实际上,它应该适用于具有-r选项的每个jq版本.