在 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)