Json JQ值映射

Json JQ值映射,json,jq,Json,Jq,我有一个很大的JSON文件,我想在其中基于某种映射转换一些值 我掌握的数据如下: [ {"id":1, "value":"yes"}, {"id":2, "value":"no"}, {"id":3, "value":"maybe"} ] 我想把它转换成这样一个列表: [ {"id":1, "value":"10"}, {"id":2, "value":"0"}, {"id":3, "value":"5"} ] cat data.json| j

我有一个很大的JSON文件,我想在其中基于某种映射转换一些值

我掌握的数据如下:

[
    {"id":1, "value":"yes"},
    {"id":2, "value":"no"},
    {"id":3, "value":"maybe"}
]
我想把它转换成这样一个列表:

[
    {"id":1, "value":"10"},
    {"id":2, "value":"0"},
    {"id":3, "value":"5"}
]
cat data.json| jq '.data[] | .value = (if .value == "yes" then "10" elif .value == "maybe" then "5"  else "0" end)'
使用固定映射:

yes => 10
no => 0
maybe => 5
我当前的解决方案基于一个简单的
if else
组合,如下所示:

[
    {"id":1, "value":"10"},
    {"id":2, "value":"0"},
    {"id":3, "value":"5"}
]
cat data.json| jq '.data[] | .value = (if .value == "yes" then "10" elif .value == "maybe" then "5"  else "0" end)'
但这真的很难看,我希望有一个更直接的方式来表达映射


感谢您的帮助

因为您正在转换字符串值,所以应该能够使用json对象保存映射。那么映射将是微不足道的

$ jq --arg mapping '{"yes":"10","no":"0","maybe":"5"}'
    'map(.value |= ($mapping | fromjson)[.])' data.json

如果希望避免必须在命令行上指定映射,那么以下两个变体可能会引起兴趣

第一个变体可与jq 1.3、jq 1.4和jq 1.5一起使用:

def mapping: {"yes":"10","no":"0","maybe":"5"};
map(.value |=  mapping[.])
下一个变体使用--argfile选项(从jq 1.4开始提供),如果映射对象在文件中可用,那么它将非常有用:

jq --argfile mapping mapping.jq 'map(.value |= $mapping[.])' data.json

最后,在jq 1.5中,基于导入的其他替代方案也可用(!)。

这里有一个使用“内联”对象的解决方案,因为映射很小:

map(.value = {"yes":"10","no":"0","maybe":"5"}[.value])
可使用
|=
短路,如在的解决方案中:

map(.value |= {"yes":"10","no":"0","maybe":"5"}[.])

注意,在最近的jq构建中,您可以使用
--argjson
而不是
--arg
来省略脚本中的
|fromjson
指令。