使用Python在嵌套的json中查找特定值

时间:2017-07-31 18:31:22

标签: python json

我有一个包含大量嵌套json对象的文件。我在下面粘贴了一小段。我正在尝试使用python查询文件中的所有对象,以提取出至少包含一个自定义Feed的对象 - 以“http://commshare”开头的url值。某些对象不会有任何自定义Feed,并且其他人将有一个或多个自定义Feed,其中每个可能或可能不以我正在搜索的字符串开头。任何帮助,将不胜感激!我是Python的新手。

示例JSON

 [{
    "empid": "12345",
    "values": {
      "custom_feeds": {
        "custom_feeds": [
          {
            "name": "Bulletins",
            "url": "http://infoXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
          }
        ]
      },
      "gadgetTitle": "InfoSec Updates",
      "newWindow": false,
      "article_limit_value": 10,
      "show_source": true
    }
  },
  {
    "empid": "23456",
    "values": {
      "custom_feeds": {
        "custom_feeds": [
          {
            "name": "1 News",
            "url": "http://blogs.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
          },
          {
            "name": "2 News",
            "url": "http://info.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
          },
          {
            "name": "3 News",
            "url": "http://blogs.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
          },
          {
            "name": "4 News",
            "url": "http://commshare.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
          }
        ]
      },
      "gadgetTitle": "Org News",
      "newWindow": false,
      "article_limit_value": 10,
      "show_source": true
    }
  },  {
    "empid": "34567",
    "values": {
      "custom_feeds": {
        "custom_feeds": []
      },
      "gadgetTitle": "Org News",
      "newWindow": false,
      "article_limit_value": 10,
      "show_source": true
    }
  }]

1 个答案:

答案 0 :(得分:1)

假设您的文件名为input.json并且您想要每个Feed的对象,您可以解析JSON并使用列表解析创建一个新的列表,其中Feed符合您的条件:

import json

with open('input.json') as input_file:
    items = json.loads(input_file.read())

feeds = [{'name': feed['name'], 'url': feed['url'], 'empid': item['empid']}
    for item in items
    for feed in item['values']['custom_feeds']['custom_feeds']
    if feed['url'].startswith('http://commshare')]

assert feeds == [{'name': '4 News', 'url': 'http://commshare.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx', 'empid': '23456'}]