python - 使用 Python 从另一个字段满足条件的大型 JSON 文件中解析字段

标签 python json azure

我以前从未使用过 JSON 文件,并且找不到使用 Python 从文件中获取某些字段的方法。相关文件是 Azure 服务标记文件,其中按区域列出了所有 Azure 服务并列出了所使用的 IP 地址。最新文件可以在这里找到https://www.microsoft.com/en-us/download/details.aspx?id=56519但下面是一个示例(超过 70,000 行)。

{
  "changeNumber": 135,
  "cloud": "Public",
  "values": [
    {
      "name": "ActionGroup",
      "id": "ActionGroup",
      "properties": {
        "changeNumber": 7,
        "region": "",
        "regionId": 0,
        "platform": "Azure",
        "systemService": "ActionGroup",
        "addressPrefixes": [
          "13.66.60.119/32",
          "13.66.143.220/30",
          "13.66.202.14/32",
          "13.66.248.225/32",
          "13.66.249.211/32",
          "13.67.10.124/30",
          "13.69.109.132/30"
        ],
        "networkFeatures": [
          "API",
          "NSG",
          "UDR",
          "FW"
        ]
      }
    },
    {
      "name": "ApplicationInsightsAvailability",
      "id": "ApplicationInsightsAvailability",
      "properties": {
        "changeNumber": 2,
        "region": "",
        "regionId": 0,
        "platform": "Azure1",
        "systemService": "ApplicationInsightsAvailability",
        "addressPrefixes": [
          "13.86.97.224/27",
          "13.86.98.0/27",
          "13.86.98.48/28",
          "13.86.98.64/28",
          "20.37.156.64/27",
          "20.37.192.80/29"
        ],
        "networkFeatures": [
          "API",
          "NSG",
          "UDR",
          "FW"
        ]
      }
    },
  ]
}

我想做的是“如果regionId在27到30之间,则打印addressPrefixes”。我尝试过使用 jsonpath_rw、jsonpath_rw_ext、pandas 以及可能的其他一些方法来实现此目的(我已经偶尔关注这个问题有一段时间了)。

此代码将打印唯一区域 ID 的列表(使用 jsonpath_rw_ext):

with open(r'C:\Temp\ServiceTags_Public_20210215.json') as f:
    data = json.load(f)

listRegionId = []
for regionId in jp.match("$..properties.regionId", data):
    if regionId not in listRegionId:
        listRegionId.append(regionId)
print(listRegionId)

如果我将 if 语句更改为 if regionId == 30: 那么我如何引用 addressPrefixes 字段?

非常感谢

编辑添加我是一名网络工程师,可以使用一些 Python,因此我的代码不是最好的

最佳答案

我希望这是你想要的:

import json
with open('test.json', 'r') as f:
    data = json.load(f)

for element in data['values']:
    region_id = element['properties']['regionId']
    if 27 < region_id < 30:
        print('RegionId: ' + str(region_id))
        print(element['properties']['addressPrefixes'])

我在您附加的 json 数据上尝试了它,无法显示整个输出,所以这里是它的示例:

RegionId: 29
['2603:1020:305:402::178/125']
RegionId: 28
['2603:1020:605:402::178/125']
RegionId: 29
['13.87.122.84/31', '13.87.123.144/28', '2603:1020:305:402::140/124']
RegionId: 28
['51.137.136.0/32', '51.140.210.84/31', '51.140.211.176/28', '2603:1020:605:402::140/124']
RegionId: 29
['2603:1020:305:402::a0/123']

关于python - 使用 Python 从另一个字段满足条件的大型 JSON 文件中解析字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67058855/

相关文章:

Python:使用 lxml 添加 xml 模式属性

python - Sqlalchemy 结果后处理

ios - Json 数据未显示在 tableView 上

javascript - 从 json 数据中删除特定或选定的属性。我不想仅删除类别为 :null 的所有键值对

azure - 通过 terraform 有条件地添加到资源属性

azure - Azure IoTHub 上的每台设备是否有消息接收限制?

python - 有没有更好的方法在 python 中执行 "unravel"函数?

python - Pytest:如何在测试之外访问命令行参数

json - Grails:在映射构造函数中设置 transient 字段

asp.net - 如何在 Azure 移动应用中的 SignalR.Hub 中获取 MobileAppSettingsDictionary