json - 为什么 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
}
所以我的问题是我在这里做错了什么?在此先感谢您的任何指点。
解决方案
您遇到了 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)
推荐阅读
- javascript - 如何将javascript变量设置为laravel刀片文件?
- python - Groupby 并使用 Vaex 组合数据框
- php - PHP循环通过JSON创建一个新数组
- angular - 如何从服务访问我的商店?
- unity3d - 如何从过去的相机位置获取 WorldToScreenPoint?
- postgresql - 为什么 PostgreSQL 不在这里责怪 `into _res`?
- php - 我应该如何获得以下 JSON 响应?
- python - 为什么此代码在没有任何输入的情况下在启动时显示“A”?
- ssh - SSH 用户(非 root)无法通过 pubkey 登录
- javascript - class="alert hide" 不起作用。所以一直显示