我有以下格式的json文件
{
"l1":"",
"values":{
"id1":{
"name":"abc",
"enabled":"true"
},
"id2":{
"name":"def",
"enabled":"true"
},
"id3":{
"name":"jjj"
}
}
}
我想基于父键添加/更新json对象的启用状态。 因此,例如:我有一个包含以下内容的文件。
id1 false
id2 true
id3 false
id4 false
我希望我的输出如下所示:
{
"l1":"",
"values":{
"id1":{
"name":"abc",
"enabled":"false"
},
"id2":{
"name":"def",
"enabled":"true"
},
"id3":{
"name":"jjj",
"enabled":"false"
}
}
}
jq版本:1.5
答案 0 :(得分:1)
您可以仅创建要更新的ID和要更新的值的映射。然后使用该映射更新相应的值。
$ jq --argjson m '{"id1":"false","id2":"true","id3":"false","id4":"false"}' '
.values |= with_entries(.value.enabled = $m[.key])
' input.json
答案 1 :(得分:0)
此响应解决了有关将正确/错误文本文件转换为JSON的问题。可以通过将文本文件传递到以下位置以独立方式实现:
jq -nR '
([inputs |capture("(?<key>.*) (?<value>(true|false)) *$")
| select(.value | fromjson | type == "boolean") ]
| from_entries)'
或者更好的是,@ JeffMercado的过滤器可以与上述方法结合使用,例如像这样:
jq -nR --argfile in input.json '
([inputs |capture("(?<key>.*) (?<value>(true|false)) *$")
| select(.value | fromjson | type == "boolean") ]
| from_entries) as $dict
| $in
| .values |= with_entries(.value.enabled = $dict[.key])
'
(是的,--argfile
已过时,请随时使用您喜欢的替代方法。)
如果您希望enabled
为布尔值(即true
或false
),则可以在调用| map_values(fromjson)
之后立即添加from_entries
。
答案 2 :(得分:0)
或者,使用步行路径unix实用程序 jtc
也可以实现同样的目的。
bash $ ID='{"id1":false,"id2":true,"id3":false,"id4":false}'
bash $ <base_id.json jtc -w'<^id\d+>L:' -mu"$ID" -u'<$0>t' -T'{"enabled":{}}'
{
"l1": "",
"values": {
"id1": {
"enabled": false,
"name": "abc"
},
"id2": {
"enabled": true,
"name": "def"
},
"id3": {
"enabled": false,
"name": "jjj"
}
}
}
bash $
-w
)每个带有标签的标签,该标签以REGEX ^id\d+
开头(REGEX匹配的结果自动存储在名称空间$0
中)-m
)-将要更新(重写)的数据从变量$ID
中的JSON中提取并按标签(<$0>t
)搜索-T
)之前,$ID
中找到的值将转换为所需的格式 PS>披露:我是jtc
-用于JSON操作的shell cli工具的创建者