json - 将所有 JSON 字符串转换为 JSON
问题描述
我有一个 JSON 对象,其中包含 JSON 中各个级别的 JSON 字符串,例如我想转换为嵌套 JSON 的下面的那个。
输入:
{
"requestType": "POST",
"response": {
"size": 2,
"text": "{\"recordID\":1, \"title\":\"Hello\", \"content\":\"Lorem ipsum\"}"
},
"scheme": "{\"scheme\":\"https\"}"
}
输出:
{
"requestType":"POST",
"response":{
"size":2,
"text":{
"recordID":1,
"title":"Hello",
"content":"Lorem ipsum"
}
},
"scheme":{
"scheme":"https"
}
}
我知道可以使用转换一个特定对象,fromjson
但是有没有一种更简单的方法可以将这些字符串的所有出现转换为 json?
解决方案
如果你的 jq 有walk
那么你可以简单地写:
walk(if type=="string" then fromjson? // . else . end)
否则,您可以复制并粘贴 的定义walk/1
,可以通过谷歌搜索轻松找到jq def walk
。
自己滚
或者:
def dej:
if type == "string" then fromjson? // .
elif type == "object" then map_values(dej)
elif type == "array" then map(dej)
else .
end;
dej
深度去json化
如果您希望dej
根据需要多次应用上述定义以实现静止,那么您可以使用以下定义:
def dejx:
def dej:
if type == "string" then fromjson? // .
elif type == "object" then map_values(dej)
elif type == "array" then map(dej)
else .
end;
dej as $d | if . == $d then . else $d|dejx end;
fromjson
直接使用
对于简单的情况,您可以只使用fromjson
, 例如在您的情况下:
.scheme |= fromjson
| .response.text |= fromjson