23

私はこのコードを持っています

import json
from pprint import pprint
json_data=open('bookmarks.json')
jdata = json.load(json_data)
pprint (jdata)
json_data.close()

どうすれば検索できu'uri': u'http:ますか?

4

5 に答える 5

34

ObjectPathは、JSON およびネストされた辞書とリストの構造をクエリする機能を提供するライブラリです。たとえば、 を使用すると、属性の深さに関係なく、「foo」という名前のすべての属性を検索できます$..foo

ドキュメントはコマンド ライン インターフェイスに焦点を当てていますが、パッケージの Python 内部を使用してプログラムでクエリを実行できます。以下の例では、既にデータを Python データ構造 (辞書とリスト) に読み込んでいると想定しています。JSON ファイルまたは文字列から始める場合は、まずjson モジュールからloadまたはを使用する必要があります。loads

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)

リストの 3 番目の項目など、「foo」属性がない要素をスキップしただけであることに注意してください。より複雑なクエリを実行することもできます。これにより、ObjectPath は深くネストされた構造に対して便利になります (たとえば、x が z: を持つ y を持つ場所を見つける$.x.y.z)。詳細については、ドキュメントチュートリアルを参照してください。

于 2017-01-05T23:40:59.310 に答える
28

辞書を返すだけなので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:'

編集:データをループする方法についてのアイデアを与えるために、次の例を考えてみましょう:

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

データ構造を調べる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/'},
 (...)
}]

次に「それを検索するu'uri': u'http:'には、次のようにします。

for c in build_structure(jdata):
    if c['uri'].startswith('http:'):
        print 'Started with http'
于 2011-12-05T11:35:17.177 に答える
-1

出力だけが必要な場合はjsonpipeを使用できます(コマンド ラインの方が快適です)。

cat bookmarks.json | jsonpipe |grep uri
于 2011-12-05T11:52:33.580 に答える