【问题标题】:json transformations using jq使用 jq 进行 json 转换
【发布时间】:2017-04-26 08:33:55
【问题描述】:

我有很多 JSON 对象,如下所示,我想做的是转换每个对象,除了小的调整之外,最后命名的节点添加了长度节点,所以最后,我们有每个部分的长度总和:

输入示例 JSON 对象

{ 
    "serialnumber": "5690",
    "duplicate": true,
    "parts": [
        {
            "serialnumber": "43",
            "position_in": true,
            "duplicate": true,
            "positions": [
                {
                    "self": 0,
                    "length": 3
                },
                {
                    "self": 4,
                    "length": 1
                },
                {
                    "self": 5,
                    "length": 2
                }
            ]
        },
        {
            "serialnumber": "745",
            "position_in": true,
            "duplicate": false,
            "positions": [
                {
                    "self": 0,
                    "length": 8
                },
                {
                    "self": 8,
                    "length": 1
                },
                {
                    "self": 9,
                    "length": 1
                }
            ]
        }
    ]
}

所需的 JSON 输出:

{
    "5690": {
        "duplicate": true,
        "parts": {
            "43": {
                "position_in": true,
                "duplicate": true,
                "last": "7"
            },
            "745": {
                "position_in": true,
                "duplicate": false,
                "last": "10"
            }
        }
    }
}

您将如何使用 jq 和 + 运算符实现所需的结果?

【问题讨论】:

    标签: json jq


    【解决方案1】:

    这里的技巧是定义一个辅助函数:

    # Given a part, extract the desired bits and the sum of the lengths:
    def part: 
      { (.serialnumber):
          {position_in,
           duplicate,
           last: (.positions | map(.length) | add) }};
    

    现在我们基本上可以以声明的方式写下我们想要的内容:

    { (.serialnumber): { duplicate, "parts": (.parts | map(part) ) } }
    

    输出

    将您的数据放在 sample.json 中,并将上述数据放在名为 program.jq 的文件中,调用:

     jq -f program.jq sample.json
    

    产生:

    {
      "5690": {
        "duplicate": true,
        "parts": [
          {
            "43": {
              "position_in": true,
              "duplicate": true,
              "last": 6
            }
          },
          {
            "745": {
              "position_in": true,
              "duplicate": false,
              "last": 10
            }
          }
        ]
      }
    }
    

    【讨论】:

    • 应该如何进行上述操作,以便能够遍历示例 JSON 文件的所有对象?我在示例 JSON 文件中有一个对象数组,如上面的对象
    • [ {...like_sample_JSON_file}, {...like_sample_JSON_file}, {...like_sample_JSON_file}, {...like_sample_JSON_file},],所以我需要迭代每个对象,并且 .我使用的 [] 对我没有帮助
    • 这取决于您希望最终结果是数组还是流。您可以将 map(_) 用于前者,而 .[] | _ 对于后者,但在每种情况下都有其他选择。您可能想看看其中一个 jq 教程....
    • 一个最终结果为数组的例子,欢迎您在上面的回答中,谢谢
    • 所以将 map 包裹在程序的单行部分:map( ... )
    猜你喜欢
    • 2018-01-09
    • 1970-01-01
    • 1970-01-01
    • 2015-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多