如何使用 jq (或其他替代方法)解析 JSON 字符串?

Posted

技术标签:

【中文标题】如何使用 jq (或其他替代方法)解析 JSON 字符串?【英文标题】:how to parse a JSON String with jq (or other alternatives)? 【发布时间】:2016-05-11 07:54:56 【问题描述】:

我正在尝试让 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

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

【问题讨论】:

如果您正在寻找这个问题也有帮助:“How to unescape json string using jq?” 【参考方案1】:

jq 为此内置了fromjson

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

fromjson 是在 1.4 版本中添加的。

【讨论】:

谢谢。这行得通。我会接受这个答案,因为我觉得它更“惯用”。干杯。 @ColinGrogan 请做。 @ColinGrogan:我认为没有任何理由更改已接受的答案,因为您在问题中清楚地写道,您使用了 jq 的 1.3 版,其中 fromjson 功能不可用。换句话说,即使这个答案很有趣,它也不能回答问题。 是否可以在整个 json 文件上使用它(不指定 .id 属性)? @FlorianCastelain 是的,要么省略它,要么使用点:jq 'fromjson | .' myfile,其中 myfile 包含 "\"key\":1, \"word\":\"cat\""【参考方案2】:

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

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

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

【讨论】:

-r 比公认的答案容易得多。你得到了我的支持。我使用 jq 从剪贴板查看 json。所以当我遇到这个时,我会这样做:pbpaste | jq -r 奖励:如果你想转义引号,你可以使用 sed:pbpaste | sed -e 's/\\\"/\"/g'。当您转义包含转义 json 的 json 时,这会有所帮助。用 sed 取出第一级的转义引号,然后 jq 可以去掉最后一级。例如pbpaste | sed -e 's/\\\"/\"/g' | jq -r【参考方案3】:

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

一些JSON非转义字符串

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

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

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

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

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

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

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

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

【讨论】:

我遇到了类似的问题。使用相同的 sed 命令逐字逐句。太棒了!将该结果通过管道传输到jq -r,您可以在 json 中处理转义的 json。

以上是关于如何使用 jq (或其他替代方法)解析 JSON 字符串?的主要内容,如果未能解决你的问题,请参考以下文章

linux使用jq解析json

jq --stream 解析 json 所需的帮助

如何删除 jq 输出中的双引号以在 bash 中解析 json 文件?

如何删除 jq 输出中的双引号以在 bash 中解析 json 文件?

如何在没有 `jq` 的情况下获取 JSON 字段值?

如何在没有`jq`的情况下获取JSON字段值?