2017-07-31 139 views
0

我有一個包含大量嵌套json對象的文件。我在下面粘貼了一小段。我正在嘗試使用python查詢文件中的所有對象以提取那些至少具有一個以「http://commshare」開頭的自定義提要 - url值的對象。某些對象不會有任何自定義提要,而其他對象將具有一個或多個自定義提要,每個可能或不可能以我正在搜索的字符串開頭。任何幫助,將不勝感激!我對Python很陌生。使用Python在嵌套json中查找特定值

例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 
    } 
    }] 
+0

使用'json.load(open('path/to/input/file'))'將它加載到python字典中。遍歷每個對象(字典),並檢查'len(obj ['values'] ['custom_feeds'] ['custom_feeds']) – inspectorG4dget

+0

我不相信這是有效的JSON – Chris

回答

1

假設你的文件名爲input.json並希望各供對象,你可以解析JSON並創建一個新的列表,其中飼料用列表解析符合條件:

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'}] 
+0

這太棒了 - 謝謝!我怎樣才能添加相應的empid所以我知道附加到每個url的empid? –

+0

一種方法是用'empid'字段在編輯中構造一個新對象(編輯後顯示示例)。 –