我是Python新手。我试图从URL解析json结果。最初,我使用以下内容:
response = urllib.request.urlopen(url)
json_obj = json.load(response)
这给出了一个错误:“JSON对象应该'str'而不是'bytes'”所以,在搜索stackoverflow之后,我按如下方式解码了响应:
f = urllib.request.urlopen(url)
charset = f.info().get_param('charset', 'utf8')
data = f.read()
decoded = json.loads(data.decode(charset))
如果我打印“已解码”,则如下:
{'Links': {'SummaryData': 'https://localhost/piwebapi/streams/P0_7qHaW4UHU-RlCaz8tpasAAQAAAAU0hJTExNQU42NDIwXFNJTlVTT0lE/summary', 'Value': 'https://localhost/piwebapi/streams/P0_7qHaW4UHU-RlCaz8tpasAAQAAAAU0hJTExNQU42NDIwXFNJTlVTT0lE/value', 'InterpolatedData': 'https://localhost/piwebapi/streams/P0_7qHaW4UHU-RlCaz8tpasAAQAAAAU0hJTExNQU42NDIwXFNJTlVTT0lE/interpolated', 'Self': 'https://localhost/piwebapi/points/P0_7qHaW4UHU-RlCaz8tpasAAQAAAAU0hJTExNQU42NDIwXFNJTlVTT0lE', 'PlotData': 'https://localhost/piwebapi/streams/P0_7qHaW4UHU-RlCaz8tpasAAQAAAAU0hJTExNQU42NDIwXFNJTlVTT0lE/plot', 'DataServer': 'https://localhost/piwebapi/dataservers/s0_7qHaW4UHU-RlCaz8tpasAU0hJTExNQU42NDIw', 'RecordedData': 'https://localhost/piwebapi/streams/P0_7qHaW4UHU-RlCaz8tpasAAQAAAAU0hJTExNQU42NDIwXFNJTlVTT0lE/recorded'}, 'Id': 1, 'Name': 'SINUSOID', 'WebId': 'P0_7qHaW4UHU-RlCaz8tpasAAQAAAAU0hJTExNQU42NDIwXFNJTlVTT0lE'}
现在,每当我尝试提取特定值时,我都会收到“KeyError”。例如:
print(decoded[0])
返回以下内容:
Traceback (most recent call last):
File "C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\Extensio
ns\Microsoft\Python Tools for Visual Studio\2.1\visualstudio_py_util.py", line 1
06, in exec_file
exec_code(code, file, global_variables)
File "C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\Extensio
ns\Microsoft\Python Tools for Visual Studio\2.1\visualstudio_py_util.py", line 8
2, in exec_code
exec(code_obj, global_variables)
File "C:\Users\shillman\Documents\Visual Studio 2010\Projects\PythonApplicatio
n1\PythonApplication1\PythonApplication1.py", line 26, in <module>
print(decoded[0])
KeyError: 0
“解码”的格式是什么?有没有办法可以做到这一点,它实际上是一个字典?有没有办法将其转换为字典?非常感谢任何帮助/建议!谢谢。
答案 0 :(得分:0)
“解码”的格式是什么?有没有办法可以做到这一点,它实际上是一个字典?有没有办法将其转换为字典?
根据您打印的内容,decoded
是一本字典,而这正是问题所在。
此词典的键是'Links'
,'Name'
,'Id'
和'WebId'
。但是decoded[0]
正在使用键0
查找值。没有这样的密钥,所以你得到一个错误。
听起来你真正想要的是通过将字典视为列表或其他序列来获取第一个值的方法。您可以将字典中的键,值或项目视为序列,但不能直接处理,因为:
0
或1
作为关键字而不是'Links'
或'Name'
。[]
运算符。如果你想获得字典中的第一个值 - 同时记住订单是任意的,而“第一个”可能并不意味着你想要什么 - 你可以这样做:
list(decoded.values())[0]
...或者,不那么浪费,将其视为可迭代而不是试图将其变成一个序列:
next(iter(decoded.values())
如果您仍在使用Python 2.x,values()
实际上会返回一个列表,因此这些都是浪费且不必要的;你想要改用next(decoded.itervalues())
。
答案 1 :(得分:0)
json.loads()
将json解码为python对象。 [1]
您的decoded
已经是python字典,但它没有密钥0
。
您可以使用decoded['Links']