使用jq

时间:2019-07-03 05:32:50

标签: json jq

我有以下格式的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

3 个答案:

答案 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为布尔值(即truefalse),则可以在调用| 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工具的创建者