在 python3 中按 IP 网络对 JSON 进行排序
Sort JSONs by IP Network in python3
我想在 python3.
的每个范围(例如 range1、range2)中按关键字“vnet”对这些 JSON 对象进行排序
我已经能够这样排序了:
source["range1"].sort(key=lambda x: x["vnet"])
但不幸的是,它没有使用任何 IP 地址逻辑,而是按字符排序。
未排序示例:
{
"range1": [
{
"name": "vnet1",
"vnet": "192.168.11.0/25",
"subnet": []
},
{
"name": "vnet2",
"vnet": "192.168.2.0/24",
"subnet": []
}
],
"range2": [
{
"name": "vnet3",
"vnet": "10.168.11.0/25",
"subnet": []
},
{
"name": "vnet4",
"vnet": "10.168.2.0/25",
"subnet": []
},
{
"name": "vnet5",
"vnet": "10.168.220.0/25",
"subnet": []
}
]
}
排序后应如下所示:
{
"range1": [
{
"name": "vnet2",
"vnet": "192.168.2.0/24",
"subnet": []
},
{
"name": "vnet1",
"vnet": "192.168.11.0/25",
"subnet": []
}
],
"range2": [
{
"name": "vnet4",
"vnet": "10.168.2.0/25",
"subnet": []
},
{
"name": "vnet3",
"vnet": "10.168.11.0/25",
"subnet": []
},
{
"name": "vnet5",
"vnet": "10.168.220.0/25",
"subnet": []
}
]
}
非常感谢任何帮助,因为我现在被困在这里。
假设你的字典存储在 json_dict
.
您可以使用socket.inet_aton(__ip_string: str)
作为排序功能的关键。它将 ip 字符串转换为 32 位压缩二进制文件。
所以下面的代码会做你想做的事
import socket
json_dict = {
"range1": [
{
"name": "vnet1",
"vnet": "192.168.11.0/25",
"subnet": []
},
{
"name": "vnet2",
"vnet": "192.168.2.0/24",
"subnet": []
}
],
"range2": [
{
"name": "vnet3",
"vnet": "10.168.11.0/25",
"subnet": []
},
{
"name": "vnet4",
"vnet": "10.168.2.0/25",
"subnet": []
},
{
"name": "vnet5",
"vnet": "10.168.220.0/25",
"subnet": []
}
]
}
for key, value in json_dict.items():
value.sort(key=lambda x: socket.inet_aton(x['vnet'].split("/")[0]))
print(json_dict)
我想在 python3.
的每个范围(例如 range1、range2)中按关键字“vnet”对这些 JSON 对象进行排序我已经能够这样排序了:
source["range1"].sort(key=lambda x: x["vnet"])
但不幸的是,它没有使用任何 IP 地址逻辑,而是按字符排序。
未排序示例:
{
"range1": [
{
"name": "vnet1",
"vnet": "192.168.11.0/25",
"subnet": []
},
{
"name": "vnet2",
"vnet": "192.168.2.0/24",
"subnet": []
}
],
"range2": [
{
"name": "vnet3",
"vnet": "10.168.11.0/25",
"subnet": []
},
{
"name": "vnet4",
"vnet": "10.168.2.0/25",
"subnet": []
},
{
"name": "vnet5",
"vnet": "10.168.220.0/25",
"subnet": []
}
]
}
排序后应如下所示:
{
"range1": [
{
"name": "vnet2",
"vnet": "192.168.2.0/24",
"subnet": []
},
{
"name": "vnet1",
"vnet": "192.168.11.0/25",
"subnet": []
}
],
"range2": [
{
"name": "vnet4",
"vnet": "10.168.2.0/25",
"subnet": []
},
{
"name": "vnet3",
"vnet": "10.168.11.0/25",
"subnet": []
},
{
"name": "vnet5",
"vnet": "10.168.220.0/25",
"subnet": []
}
]
}
非常感谢任何帮助,因为我现在被困在这里。
假设你的字典存储在 json_dict
.
您可以使用socket.inet_aton(__ip_string: str)
作为排序功能的关键。它将 ip 字符串转换为 32 位压缩二进制文件。
所以下面的代码会做你想做的事
import socket
json_dict = {
"range1": [
{
"name": "vnet1",
"vnet": "192.168.11.0/25",
"subnet": []
},
{
"name": "vnet2",
"vnet": "192.168.2.0/24",
"subnet": []
}
],
"range2": [
{
"name": "vnet3",
"vnet": "10.168.11.0/25",
"subnet": []
},
{
"name": "vnet4",
"vnet": "10.168.2.0/25",
"subnet": []
},
{
"name": "vnet5",
"vnet": "10.168.220.0/25",
"subnet": []
}
]
}
for key, value in json_dict.items():
value.sort(key=lambda x: socket.inet_aton(x['vnet'].split("/")[0]))
print(json_dict)