【问题标题】:Python -- get at JSON info that's written like XMLPython——获取像 XML 一样编写的 JSON 信息
【发布时间】:2016-05-08 17:11:54
【问题描述】:

在 Python 中,我通常使用这种模板来做简单的 JSON:

url = "url"
file = urllib2.urlopen(url)
json = file.read()
parsed = json.loads(json)

然后通过如下调用获取变量:

parsed[obj name][value name]

但是,这适用于格式大致如下的 JSON:

{'object':{'index':'value', 'index':'value'}}

我刚才遇到的JSON格式是这样的:

{'index':'value', 'index':'value'},{'index':'value', 'index':'value'}

所以我没有名字来引用不同的块。当然,这些块提供不同的信息,但具有相同的“键”——就像 XML 通常被格式化一样。使用我上面的方法,我将如何解析这个 JSON?

【问题讨论】:

  • 是的,我只是没有包括括号。既然你提到了,列表是数字索引,所以我突然想到我可以使用像 json[1]['index'] 这样的数字索引。谢谢。

标签: python json python-2.7 parsing urllib2


【解决方案1】:

以下不是有效的 JSON。

{'index':'value', 'index':'value'},{'index':'value', 'index':'value'}

在哪里

[{'index':'value', 'index':'value'},{'index':'value', 'index':'value'}] 是一个有效的 JSON。

python trackback 显示

import json
string = "{'index':'value', 'index':'value'},{'index':'value', 'index':'value'}"
parsed = json.loads(string)
print parsed

Traceback (most recent call last):
  File "/Users/tron/Desktop/test3.py", line 3, in <module>
    parsed_json = json.loads(json_string)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/__init__.py", line 338, in loads
    return _default_decoder.decode(s)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/decoder.py", line 369, in decode
    raise ValueError(errmsg("Extra data", s, end, len(s)))
ValueError: Extra data: line 1 column 27 - line 1 column 54 (char 26 - 53)
[Finished in 0.0s with exit code 1]

如果你这样做,在哪里

json_string = '[{"a":"value", "b":"value"},{"a":"value", "b":"value"}]'

一切正常。

如果是这样,您可以将其称为 Json 数组。其中json_string[0] 是第一个 JSON 字符串。 json_string[1] 是第二个,依此类推。

否则,如果您认为这将是您“必须处理”的问题。这是一种选择:

想一想 JSON 格式错误的方式,并编写一个简单的类来解决这些问题。在上述情况下,您可以通过以下方式处理它。

import json
json_string = '{"a":"value", "b":"value"},{"a":"value", "b":"value"}'
def parseJson(string):
    parsed_json = None
    try:
        parsed_json = json.loads(string)
        print parsed_json
    except ValueError, e:
        print string, "didnt parse"
        if  "Extra data" in str(e.args):
            newString = "["+string+"]"
            print newString
            return parseJson(newString)

您可以添加更多 if/else 来处理您遇到的各种问题。我不得不承认,这很 hacky,我认为你永远无法解释每一个可能的突变。

祝你好运

【讨论】:

    【解决方案2】:

    结果必须是listdict

    [{'index1':'value1', 'index2':'value2'},{'index1':'value1', 'index2':'value2'}]
    

    因此您可以使用数字来引用它:item[1]['index1']

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-28
      • 1970-01-01
      • 1970-01-01
      • 2017-03-20
      相关资源
      最近更新 更多