使用jq解析JSON字符串

时间:2016-02-02 13:21:34

标签: json string sed escaping jq

我正在尝试让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替换所有转义字符(\":\"\",\"\"),但这很麻烦,我认为{{1}内置了一种方法这样做?

谢谢!

编辑: 此外,这里提供的jq版本是:

jq

我想如果需要我可以更新它。

3 个答案:

答案 0 :(得分:83)

jq为此建立了fromjson

jq '.c | fromjson | .id' myFile.json
版本1.4中添加了

fromjson

答案 1 :(得分:29)

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

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

ADDENDUM:这有利于它在jq 1.3及以上版本中工作;实际上,它应该适用于具有-r选项的每个jq版本。

答案 2 :(得分:0)

动机:您想要解析 JSON 字符串 - 您想要转义用引号包裹并表示为字符串缓冲区的 JSON 对象,并将其转换为有效的 JSON 对象。例如:

一些 JSON 未转义字符串

"{\"name\":\"John Doe\",\"position\":\"developer\"}"

预期结果(一个 JSON 对象):

{"name":"John Doe","position":"developer"}

解决方案:为了转义 JSON 字符串并将其转换为有效的 JSON 对象,请在命令行中使用 sed 工具并使用正则表达式删除/替换特定字符:< /p>

cat current_json.txt | sed -e 's/\\\"/\"/g' -e 's/^.//g' -e 's/.$//g'

s/\\\"/\"/g 将所有反斜杠和引号 ( \" ) 替换为仅引号 (")

s/^.//g 将流中的第一个字符替换为无字符

s/.$//g 将流中的最后一个字符替换为无字符