【问题标题】:Why doesn't fromjson work as a map function on an array of objects?为什么 fromjson 不能作为对象数组上的映射函数工作?
【发布时间】:2023-03-12 13:02:02
【问题描述】:

我正在尝试遍历一个对象并将任何作为有效 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
}

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

【问题讨论】:

标签: json parsing jq


【解决方案1】:

您遇到了 jq 的一个(有点众所周知的)缺陷,即 map|=try(因此后缀 ?)这三者不能很好地混合。

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

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

或等效:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-14
    • 1970-01-01
    • 2020-04-07
    • 2022-06-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多