如何使用 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 字符串?的主要内容,如果未能解决你的问题,请参考以下文章
如何删除 jq 输出中的双引号以在 bash 中解析 json 文件?