首页 > 解决方案 > 为什么 fromjson 不能作为对象数组的映射函数工作?

问题描述

我正在尝试遍历一个对象并将任何作为有效 json 字符串的值(目前仅顶级,没有递归)转换为 json。

我认为答案在于使用正确的咒语,也许类似于with_entries(.value |= try fromjson),但我无法让它发挥作用。所以我把它分解了一下,尝试一些更简单的东西。

下面的对象列表怎么样 - 我只想解析每个对象的值键,如果它是一个产生有效 json 的字符串(现在让我们忽略无效的情况,它们可以返回 null)。

所以我尝试了这个:

$ jq -n '[{key: "one", value: 1},{key: "two", value: "{\"object\":true}"}] | map(.value |= try fromjson)'
[
  {
    "key": "one"
  },
  {
    "key": "two"
  }
]

即使two键是有效的 json 字符串,值也会丢失。

但是,如果我对一个简单的数组进行相同的尝试,它会按预期工作:

$ jq -n '[1, "two", "{\"three\":3}"] | .[] | fromjson?'
{
  "three": 3
}

所以我的问题是我在这里做错了什么?在此先感谢您的任何指点。

标签: jsonparsingjq

解决方案


您遇到了 jq 的(有点众所周知的)缺陷之一,即map, |=, try(以及因此 postfix ?)的三重奏不能很好地混合。

好消息是以下将在 jq 1.5 及更高版本中工作:

map(.value = (.value | . as $v | try fromjson catch $v))

或等效地:

map(.value as $v | .value = try ($v|fromjson) catch $v)

推荐阅读