7

私は頭を悩ませており、初めてJSONを解析しようとして、多次元配列を処理しています。

{
  "secret": "[Hidden]",
  "minutes": 20,
  "link": "http:\/\/www.1.com",
  "bookmark_collection": {
    "free_link": {
      "name": "#free_link#",
      "bookmarks": [
        {
          "name": "1",
          "link": "http:\/\/www.1.com"
        },
        {
          "name": "2",
          "link": "http:\/\/2.dk"
        },
        {
          "name": "3",
          "link": "http:\/\/www.3.in"
        }
      ]
    },
    "boarding_pass": {
      "name": "Boarding Pass",
      "bookmarks": [
        {
          "name": "1",
          "link": "http:\/\/www.1.com\/"
        },
        {
          "name": "2",
          "link": "http:\/\/www.2.com\/"
        },
        {
          "name": "3",
          "link": "http:\/\/www.3.hk"
        }
      ]
    },
    "sublinks": {
      "name": "sublinks",
      "link": [
        "http:\/\/www.1.com",
        "http:\/\/www.2.com",
        "http:\/\/www.3.com"
      ]
    }
  }
}

これは3つの部分に分かれています。最初のディメンション(シークレット、分、リンク)の静的データで、個別の文字列として取得する必要があります。

次に、「ブックマークコレクション」ごとに固定名のない辞書が必要なので、名前と各ブックマークのリンク/名前が必要です。

次に、常に同じである個別のサブリンクがあります。ここでは、個別の辞書にあるすべてのリンクが必要です。

JSONの解析について読んでいますが、私が見つけたもののほとんどは、1つの辞書に入れられた単純な配列です。誰かがこれを行うための良いテクニックを持っていますか?

4

2 に答える 2

13

JSONを解析すると、Pythondictが作成されます。したがって、上記のJSONがinput_dataという名前の文字列に含まれているとします。

import json
# This converts from JSON to a python dict
parsed_input = json.loads(input_data)

# Now, all of your static variables are referenceable as keys:
secret = parsed_input['secret']
minutes = parsed_input['minutes']
link = parsed_input['link']

# Plus, you can get your bookmark collection as:
bookmark_collection = parsed_input['bookmark_collection']

# Print a list of names of the bookmark collections...
print bookmark_collection.keys() # Note this contains sublinks, so remove it if needed

# Get the name of the Boarding Pass bookmark:
print bookmark_collection['boarding_pass']['name']

# Print out a list of all bookmark links as:
#  Boarding Pass
#    * 1: http://www.1.com/
#    * 2: http://www.2.com/
#  ...
for bookmark_definition in bookmark_collection.values():
    # Skip sublinks...
    if bookmark_definition['name'] == 'sublinks':
        continue
    print bookmark_definition['name']
    for bookmark in bookmark_definition['bookmarks']:
        print "    * %(name)s: %(link)s" % bookmark

# Get the sublink definition:
sublinks = parsed_input['bookmark_collection']['sublinks']

# .. and print them
print sublinks['name']
for link in sublinks['link']:
    print '  *', link
于 2012-09-10T01:38:51.877 に答える
2

うーん、json.loadsはトリックをしませんか?

たとえば、データがファイルにある場合、

import json
text = open('/tmp/mydata.json').read()

d = json.loads(text)

# first level fields
print d['minutes'] # or 'secret' or 'link'

# the names of each of bookmark_collections's items
print d['bookmark_collection'].keys()

# the sublinks section, as a dict
print d['bookmark_collection']['sublinks']

このコードの出力(上記のサンプル入力が与えられた場合)は次のとおりです。

20
[u'sublinks', u'free_link', u'boarding_pass']
{u'link': [u'http://www.1.com', u'http://www.2.com', u'http://www.3.com'], u'name': u'sublinks'}

どちらがあなたに必要なものを手に入れると思いますか?

于 2012-09-10T01:42:50.017 に答える