我有一个带有嵌套数组的SON格式有效负载,我想将其修改为一个更简单的array.输入看起来像这样:

[
  {
    "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的复杂性.

推荐答案

似乎您需要在addr_info个数组内循环,然后从深入研究它们的叶 node 开始,以在第一个规范中进行拼贴,并在第二个规范中动态消散外部元素,例如

[
  {
    "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/上的demo是:

enter image description here

Json相关问答推荐

如何将加权边列表导出到JSON树?

如何在VB6中将字符串转换或解码为可读格式?

Golang jsonrpc2 服务器在哪里监听?

如何使用 jq 将字符串数组转换为对象?

派生类的属性没有得到价值

下一个 Js 部署在 getStaticPath 函数上失败:在 JSON.parse 的位置 0 的 JSON 中出现意外的令牌 < 但在本地运行

如何在生产环境中更改 Flutter 应用程序中的数据模型?

使用 Jolt 使用键中的值创建带有硬编码键和值的 JSON 数组

Google GCM 服务器返回未经授权的错误 401

如何在 jQuery 中循环遍历 JSON 数组?

如何判断字符串是否为json格式

获取json中某个键的索引

Jackson 的@JsonView、@JsonFilter 和 Spring

规范化 JSON 文件

如何在已声明的 JSON 对象中添加键值对

如何使用 Jackson 注释从 HttpResponse 反序列化 JSON 对象?

无法将空值放入 JSON 对象

Protocol Buffer vs Json - 何时 Select 一个而不是另一个

如何使用 Gson 将 JSONArray 转换为 List?

来自 Gson 的 JSON 字符串:删除双引号