从嵌套的 JSON 数组中提取数据到更简单的数组中

问题描述 投票:0回答:2

我有一个 JSON 格式的有效负载,其中包含嵌套数组,我想将其修改为更简单的数组。输入看起来像这样:

[
  {
    "pim_network": [
      {
        "addresses": [
          {
            "ifindex": 1,
            "ifname": "lo",
            "address": "00:00:00:00:00:00",
            "broadcast": "00:00:00:00:00:00",
            "addr_info": [
              {
                "family": "inet",
                "local": "127.0.0.1",
                "prefixlen": 8,
                "label": "lo"
              },
              {
                "family": "inet6",
                "local": "::1",
                "prefixlen": 128
              }
            ]
          },
          {
            "ifindex": 2,
            "ifname": "ens33",
            "address": "00:0c:29:02:b8:cd",
            "broadcast": "ff:ff:ff:ff:ff:ff",
            "addr_info": [
              {
                "family": "inet",
                "local": "192.168.119.129",
                "prefixlen": 24,
                "broadcast": "192.168.119.255",
                "label": "ens33"
              },
              {
                "family": "inet6",
                "local": "fe80::20c:29ff:fe02:b8cd",
                "prefixlen": 64
              }
            ]
          },
          {
            "ifindex": 3,
            "ifname": "docker0",
            "address": "02:42:36:ae:50:55",
            "broadcast": "ff:ff:ff:ff:ff:ff",
            "addr_info": [
              {
                "family": "inet",
                "local": "172.17.0.1",
                "prefixlen": 16,
                "broadcast": "172.17.255.255",
                "label": "docker0"
              }
            ]
          }
        ]
      }
    ]
  }
]

期望的输出是(对于 ipv4 和 ipv6 数据的相同 MAC 地址,某些键:值对使用两次):

[
  {
    "pim_network": [
      {
        "ifindex": 1,
        "ifname": "lo",
        "address": "00:00:00:00:00:00",
        "broadcast": "00:00:00:00:00:00",
        "family": "inet",
        "local": "127.0.0.1",
        "prefixlen": 8,
        "label": "lo"
      },
      {
        "ifindex": 1,
        "ifname": "lo",
        "address": "00:00:00:00:00:00",
        "broadcast": "00:00:00:00:00:00",
        "family": "inet6",
        "local": "::1",
        "prefixlen": 128
      },
      {
        "ifindex": 2,
        "ifname": "ens33",
        "address": "00:0c:29:02:b8:cd",
        "broadcast": "192.168.119.255",
        "family": "inet",
        "local": "192.168.119.129",
        "prefixlen": 24,
        "label": "ens33"
      },
      {
        "ifindex": 2,
        "ifname": "ens33",
        "address": "00:0c:29:02:b8:cd",
        "broadcast": "ff:ff:ff:ff:ff:ff",
        "family": "inet6",
        "local": "fe80::20c:29ff:fe02:b8cd",
        "prefixlen": 64
      },
      {
        "ifindex": 3,
        "ifname": "docker0",
        "address": "02:42:36:ae:50:55",
        "broadcast": "172.17.255.255",
        "family": "inet",
        "local": "172.17.0.1",
        "prefixlen": 16,
        "label": "docker0"
      }
    ]
  }
]

(不起作用)到目前为止的规格:

[
  {
    "operation": "shift",
    "spec": {
      "*": {
        "*": "&",
        "pim_network": {
          "*": {
            "addresses": {
              "*": {
                "address": "pim_network.[&1].address",
                "addr_info": {
                  "*": {
                    "local": "pim_network.[&1].address.local"
                  }
                }
              }
            }
          }
        }
      }
    }
  }
]

但是我们得到这样的输出:

{
  "pim_network": [
    {
      "address": "00:00:00:00:00:00"
    },
    {
      "address": [
        {
          "local": "::1"
        },
        "00:0c:29:02:b8:cd"
      ]
    },
    {
      "address": "02:42:36:ae:50:55"
    }
  ]
}

我们一直在努力寻找有关在 JOLT 转换中使用 &(和其他查找函数)的易于理解的文档,但我们发现的大多数网站都过于抽象或假设对 JOLT 有更深入的了解。如果有人知道有好的教程或在线课程的好网站,请告诉我。我和我的同事都是高级脚本编写者,但这似乎不足以轻松掌握 JOLT 的复杂性。

json jolt
2个回答
0
投票

似乎您需要在

addr_info
数组中循环,然后开始深入研究其叶节点以平铺第一个规范,并在第二个规范中动态消散外部元素,例如

[
  {
    "operation": "shift",
    "spec": {
      "*": {
        "pim_network": {
          "*": {
            "addresses": {
              "*": {
                "*": "&4.&1.others.&", //the elements other than "addr_info"
                "addr_info": {
                  "*": {
                    "*": "&6.&3.&2[&1].&"
                  }
                }
              }
            }
          }
        }
      }
    }
  },
  {
    "operation": "shift",
    "spec": {
      "*": { //outermost level, eg. the level of "pim_network" 
        "*": { // the indexes(0,1,2) of "pim_network" derived within the previous spec
          "addr_info": {
            "*": {
              "@2,others": { "*": "&5.&4_&2.&" }, // go two levels up the tree to grab the values of the "others" object
              "*": "&4.&3_&1.&" // &4 stands for the key literal "pim_network"
            }
          }
        }
      }
    }
  },
  { //get rid of the object keys
    "operation": "shift",
    "spec": {
      "*": {
        "*": "[0].&1[]"//add a wrapper for "pim_network" by [0]
                       //add the literal "pim_network" by &1
      }
    }
  }
]

网站上的 演示 https://jolt-demo.appspot.com/ 是:

enter image description here


0
投票

库多的!!!!

如果我们只想收集 addr_info 级别的广播地址怎么办? 我们想要忽略的地址级别的广播地址。

提前感谢您的回答巴巴罗斯

问候, 阿让

© www.soinside.com 2019 - 2024. All rights reserved.