如何使用jq(或其他替代方法)解析JSON字符串?
我试图让如何使用jq(或其他替代方法)解析JSON字符串?,json,string,sed,escaping,jq,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:cannotindexstringwithstring 这是因为.c的输出是一个字符串,而不是更多的JSON。 如何让jq解析这个字符串 我最
jq
解析JSON结构,如:
{
"a" : 1,
"b" : 2,
"c" : "{\"id\":\"9ee ...\",\"parent\":\"abc...\"}\n"
}
也就是说,JSON中的元素是带有转义JSON的字符串
所以,我有一些关于
$jq[.c]myFile.json | jq[.id]
但这会在jq:error:cannotindexstringwithstring
这是因为.c的输出是一个字符串,而不是更多的JSON。
如何让jq解析这个字符串
我最初的解决方案是使用sed来替换所有的转义字符(\”:\“
,\”,\“
和\”
),但这很麻烦,我想jq
中有一种内置的方法可以做到这一点吗
谢谢
编辑:
此外,此处提供的jq版本为:
$ jq --version
jq version 1.3
我想如果需要的话我可以更新它。jq有这样的内置功能:
jq '.c | fromjson | .id' myFile.json
fromjson
是在1.4版中添加的。您可以使用原始输出(-r),它将取消对字符的扫描:
jq -r .c myfile.json | jq .id
cat current_json.txt | sed -e 's/\\\"/\"/g' -e 's/^.//g' -e 's/.$//g'
附录:它的优点是可以在jq 1.3及更高版本中使用;事实上,它应该可以在每一个具有-r选项的jq版本中使用。动机:您想要解析JSON字符串-您想要转义一个用引号包装并表示为字符串缓冲区的JSON对象,并将其转换为有效的JSON对象。用于检查ple: 一些JSON未替换字符串:
"{\"name\":\"John Doe\",\"position\":\"developer\"}"
预期结果(JSON对象):
解决方案:要转义JSON字符串并将其转换为有效的JSON对象,请使用命令行中的sed
工具,并使用正则表达式删除/替换特定字符:
jq -r .c myfile.json | jq .id
cat current_json.txt | sed -e 's/\\\"/\"/g' -e 's/^.//g' -e 's/.$//g'
s/\\\“/\”/g
将所有反斜杠和引号(\“
)替换为仅引号(”
)
s/^//g
将流中的第一个字符替换为无字符
s/$//g
将流中的最后一个字符替换为无字符谢谢。这很有效。我会接受这个答案,因为我觉得这个答案更“地道”。干杯。@ColinGrogan请这样做。@ColinGrogan:我看不出有任何理由更改被接受的答案,因为你在问题中明确写道,你在w中使用了jq的1.3版fromjson
功能不可用。换句话说,即使这个答案很有趣,它也不能回答这个问题。是否可以在整个json文件上使用它(不指定.id属性)?@FlorianCastelain是的,可以省略它或使用点:jq'fromjson |。'myfile
,其中myfile包含”{\“key\”:1、\“word\”:\“cat\”}“
如果您想了解“如何使用jq取消json字符串的显示”,这个问题也会有所帮助