首页 > 解决方案 > 将所有 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?

标签: jsonbashshellcommand-linejq

解决方案


如果你的 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

推荐阅读