接收" KeyError"从url解码json结果后

时间:2014-10-10 18:44:25

标签: python json python-3.x decode urlopen

我是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

“解码”的格式是什么?有没有办法可以做到这一点,它实际上是一个字典?有没有办法将其转换为字典?非常感谢任何帮助/建议!谢谢。

2 个答案:

答案 0 :(得分:0)

  

“解码”的格式是什么?有没有办法可以做到这一点,它实际上是一个字典?有没有办法将其转换为字典?

根据您打印的内容,decoded 是一本字典,而这正是问题所在。

此词典的键是'Links''Name''Id''WebId'。但是decoded[0]正在使用键0查找值。没有这样的密钥,所以你得到一个错误。

听起来你真正想要的是通过将字典视为列表或其他序列来获取第一个值的方法。您可以将字典中的键,值或项目视为序列,但不能直接处理,因为:

  • 这些事情的顺序完全是任意的。
  • 字典无法将01作为关键字而不是'Links''Name'
  • 因此,Python不会让你只使用普通的[]运算符。

如果你想获得字典中的第一个值 - 同时记住订单是任意的,而“第一个”可能并不意味着你想要什么 - 你可以这样做:

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

访问这些链接

[1] https://docs.python.org/2/library/json.html#json.loads