解析json并搜索它

BKo*_*vac 17 python string grep json pprint

我有这个代码

import json
from pprint import pprint
json_data=open('bookmarks.json')
jdata = json.load(json_data)
pprint (jdata)
json_data.close()
Run Code Online (Sandbox Code Playgroud)

我该如何搜索它u'uri': u'http:

jro*_*jro 22

由于json.loads只返回一个字典,你可以使用适用于类型的字典运营商:

>>> jdata = json.load('{"uri": "http:", "foo", "bar"}')
>>> 'uri' in jdata       # Check if 'uri' is in jdata's keys
True
>>> jdata['uri']         # Will return the value belonging to the key 'uri'
u'http:'
Run Code Online (Sandbox Code Playgroud)

编辑:要了解如何循环数据,请考虑以下示例:

>>> import json
>>> jdata = json.loads(open ('bookmarks.json').read())
>>> for c in jdata['children'][0]['children']:
...     print 'Title: {}, URI: {}'.format(c.get('title', 'No title'),
                                          c.get('uri', 'No uri'))
...
Title: Recently Bookmarked, URI: place:folder=BOOKMARKS_MENU(...)
Title: Recent Tags, URI: place:sort=14&type=6&maxResults=10&queryType=1
Title: , URI: No uri
Title: Mozilla Firefox, URI: No uri
Run Code Online (Sandbox Code Playgroud)

检查jdata数据结构将允许您根据需要进行导航.pprint你已经拥有的电话是一个很好的起点.

Edit2:另一次尝试.这将获取您在词典列表中提到的文件.有了这个,我认为你应该能够适应你的需求.

>>> def build_structure(data, d=[]):
...     if 'children' in data:
...         for c in data['children']:
...             d.append({'title': c.get('title', 'No title'),
...                                      'uri': c.get('uri', None)})
...             build_structure(c, d)
...     return d
...
>>> pprint.pprint(build_structure(jdata))
[{'title': u'Bookmarks Menu', 'uri': None},
 {'title': u'Recently Bookmarked',
  'uri':   u'place:folder=BOOKMARKS_MENU&folder=UNFILED_BOOKMARKS&(...)'},
 {'title': u'Recent Tags',
  'uri':   u'place:sort=14&type=6&maxResults=10&queryType=1'},
 {'title': u'', 'uri': None},
 {'title': u'Mozilla Firefox', 'uri': None},
 {'title': u'Help and Tutorials',
  'uri':   u'http://www.mozilla.com/en-US/firefox/help/'},
 (...)
}]
Run Code Online (Sandbox Code Playgroud)

然后"搜索它u'uri': u'http:'",做这样的事情:

for c in build_structure(jdata):
    if c['uri'].startswith('http:'):
        print 'Started with http'
Run Code Online (Sandbox Code Playgroud)


Sco*_*t H 20

ObjectPath是一个库,它提供查询JSON和dicts和列表的嵌套结构的能力.例如,您可以搜索所有名为"foo"的属性,无论它们有多深$..foo.

虽然文档侧重于命令行界面,但您可以使用包的Python内部以编程方式执行查询.下面的示例假设您已经将数据加载到Python数据结构(dicts和列表)中.如果您从一个JSON文件或字符串开始,您只需要首先使用loadloadsjson模块使用.

import objectpath

data = [
    {'foo': 1, 'bar': 'a'},
    {'foo': 2, 'bar': 'b'},
    {'NoFooHere': 2, 'bar': 'c'},
    {'foo': 3, 'bar': 'd'},
]

tree_obj = objectpath.Tree(data)

tuple(tree_obj.execute('$..foo'))
# returns: (1, 2, 3)
Run Code Online (Sandbox Code Playgroud)

请注意,它只是跳过了缺少"foo"属性的元素,例如列表中的第三个项目.您还可以执行更复杂的查询,这使得ObjectPath可以用于深层嵌套结构(例如,查找x具有z的y:)$.x.y.z.我将向您介绍文档教程以获取更多信息.

  • 需要注意的是,objectpath 使用 https://goessner.net/articles/JsonPath/ 进行搜索(或足够接近 jsonpath),这是一种类似于 xpath 的迷你语言,您需要熟悉它。IMO @jro 的递归答案(当前接受的答案)更好,因为它遍历树并允许您针对每个元素执行任意 Python 代码以找到您要查找的内容。 (2认同)