我有一个 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 的复杂性。
似乎您需要在
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/ 是:
库多的!!!!
如果我们只想收集 addr_info 级别的广播地址怎么办? 我们想要忽略的地址级别的广播地址。
提前感谢您的回答巴巴罗斯
问候, 阿让