Python -- 获取 JSON 信息,其写法类似于 XML
Python -- get at JSON info that's written like XML
在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'}
所以我没有名称来引用不同的块。当然,这些块提供不同的信息,但具有相同的 "keys" —— 很像 XML 通常的格式。使用我上面的方法,我将如何解析这个 JSON?
结果必须是 list
of dict
:
[{'index1':'value1', 'index2':'value2'},{'index1':'value1', 'index2':'value2'}]
因此您可以使用数字引用它:item[1]['index1']
以下内容无效 JSON。
{'index':'value', 'index':'value'},{'index':'value', 'index':'value'}
其中
[{'index':'value', 'index':'value'},{'index':'value', 'index':'value'}]
是有效的 JSON。
和python引用说明
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]
是第二个,依此类推。
否则,如果您认为这将成为您 "just have to deal with" 的问题。这是一个选项:
想一想 JSON 可能会出现畸形的方式,并写一个简单的 class 来解释它们。在上面的例子中,这里有一个 hacky 方法可以处理它。
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,我认为您永远无法解释 每个 可能的突变。
祝你好运
在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'}
所以我没有名称来引用不同的块。当然,这些块提供不同的信息,但具有相同的 "keys" —— 很像 XML 通常的格式。使用我上面的方法,我将如何解析这个 JSON?
结果必须是 list
of dict
:
[{'index1':'value1', 'index2':'value2'},{'index1':'value1', 'index2':'value2'}]
因此您可以使用数字引用它:item[1]['index1']
以下内容无效 JSON。
{'index':'value', 'index':'value'},{'index':'value', 'index':'value'}
其中
[{'index':'value', 'index':'value'},{'index':'value', 'index':'value'}]
是有效的 JSON。
和python引用说明
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]
是第二个,依此类推。
否则,如果您认为这将成为您 "just have to deal with" 的问题。这是一个选项:
想一想 JSON 可能会出现畸形的方式,并写一个简单的 class 来解释它们。在上面的例子中,这里有一个 hacky 方法可以处理它。
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,我认为您永远无法解释 每个 可能的突变。
祝你好运