将多维 Json 数组解析为 Python

Posted

技术标签:

【中文标题】将多维 Json 数组解析为 Python【英文标题】:Parsing muilti dimensional Json array to Python 【发布时间】:2012-09-02 21:15:01 【问题描述】:

我头疼,第一次尝试解析 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 个字典中的简单数组。 有没有人有任何好的技术来做到这一点?

【问题讨论】:

docs.python.org/tutorial/datastructures.html 我认为您在这里没有正确使用“数组”这个词。通过数组,我认为“大多数人”是指一个 - 可能是多维的 - 由相同类型的元素组成的数据结构。 JSON 和他们的 Python 同行“任意嵌套的字典和列表”通常不是数组,而是“对象”,这就是它的全部意义:“持有”任意对象的任意结构的东西(对象必须是 json 可序列化类型)。 是的,这也可能是我的谷歌搜索惨遭失败的原因.. 【参考方案1】:

解析 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:当然是Except the exceptions。 wauv,你立刻让我明白了这一切是如何运作的。谢谢!为什么在网上很难找到一个例子...... @IgnacioVazquez-Abrams 我想我的“确切”应该放在引号之间,而不是大写... ;o)【参考方案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'

我认为,哪个可以满足您的需求?

【讨论】:

以上是关于将多维 Json 数组解析为 Python的主要内容,如果未能解决你的问题,请参考以下文章

解析没有键的多维 JSON 数组

如何轻松地将多维 JSON 解析为 html?

jQuery解析JSON多维数组

用 Java 解析 JSON 多维数组

php解析json数组

将多维数组解析为完全指定的端点