Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用jq(或其他替代方法)解析JSON字符串?_Json_String_Sed_Escaping_Jq - Fatal编程技术网

如何使用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字符串的显示”,这个问题也会有所帮助