将多维JSON数组解析为Python

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"
      ]
    }
  }
}

这可以分为三个部分,第一个维度上的静态数据(秘密、分钟、链接),我需要将其作为单独的字符串获取。
然后,我需要针对“书签收藏”每个字典,由于它们没有固定的名称,因此我需要它们的名称以及每个书签的链接/名称。
接下来是单独的子链接,总是相同的,我需要所有链接放在单独的字典中。
我正在阅读有关解析JSON的文章,但我发现大多数内容只是简单地将数组放入1个字典中。是否有任何好的技巧可以做到这一点?

http://docs.python.org/tutorial/datastructures.html - Ignacio Vazquez-Abrams
我认为你在这里没有正确使用“数组”这个词。通过数组,我认为“大多数人”指的是一个可能是多维的数据结构,由相同类型的元素组成。JSON及其Python对应物“任意嵌套的字典和列表”通常不是数组,而是“对象”,这就是它的全部意义:用于“容纳”任意对象结构的任意结构(对象必须是可json序列化类型)。 - heltonbiker
是的,这也可能是为什么我的谷歌搜索失败惨不忍睹的原因。 - Alex R
2个回答

13

在解析JSON后,你将得到一个Python字典。因此,假设上面的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

JSON值得注意的是,它的语法与在Python中创建相同的内容所使用的语法完全相同,假设“内容”为任意嵌套字典和列表。 - heltonbiker
@heltonbiker:当然,除了异常情况。[链接](https://dev59.com/32w15IYBdhLWcg3wbLDU) - Ignacio Vazquez-Abrams
哇,你立刻让我明白了它的工作原理。谢谢!为什么在网络上很难找到一个例子呢... - Alex R
@IgnacioVazquez-Abrams 我想我的“exactely”应该放在引号中,而不是大写字母... ;o) - heltonbiker

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

我认为这样可以得到您所需的内容?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接