2014-10-10 4 views
0

Я новичок в Python. Я пытаюсь проанализировать результат json из URL-адреса. Первоначально я использовал следующее:Получение «KeyError» после декодирования json от url

response = urllib.request.urlopen(url) 
json_obj = json.load(response) 

Это дало ошибку вдоль линий «объекта JSON должен быть„ул“не„байт“» так, после поиска на 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

What format is "decoded" in? Is there a way I can do this where it is actually a dictionary? Is there a way to convert it to a dictionary?

Согласно тому, что вы распечатаны, decodedявляется словарь, и это именно проблема.

Ключи этого слова: 'Links', 'Name', 'Id' и 'WebId'. Но decoded[0] ищет значение с помощью ключа 0. Нет такого ключа, поэтому вы получите сообщение об ошибке.

Похоже, что вы действительно хотели, чтобы получить первое значение, рассматривая словарь, как если бы это был список или другая последовательность. Вы можете лечить ключи или значения, или элементы словаря в виде последовательности, но не непосредственно, потому что:

  • Порядок этих вещей совершенно произвольно.
  • Нет причин, чтобы словарь не мог иметь 0 или 1 в качестве ключа вместо 'Links' или 'Name'.
  • Поэтому Python не позволит вам это сделать, просто используя обычный оператор [].

Если вы хотите, чтобы получить первое значение в словаре, в то время как помня о том, что порядок является произвольным, и «первое» не может означать, что вы хотите, вы можете сделать это следующим образом:

list(decoded.values())[0] 

... или, менее расточительно, рассматривать его в качестве итератора вместо того, чтобы пытаться сделать это в последовательности:

next(iter(decoded.values()) 

Если вы все еще используете Python 2.x, values() фактически возвращает список, так как из них являются расточительными и ненужными; вместо этого вы должны использовать next(decoded.itervalues()).

+0

Спасибо за ответ. Когда я использую один из реальных ключей, говорят: печать (декодированного [ «WEBID»] Я все еще получаю «KeyError„WEBID“» Это не способ ссылаться на эту клавишу – JOEMan90

+1

Ах, это чувствительно к регистру? Я не знал этого. Работает сейчас. Спасибо! – JOEMan90

+0

@ JOEMan90: Не все так сложно написать нестандартный подклассом без учета регистра и подключить модуль 'json', чтобы вернуть их вместо нормальных значений dict, если вы действительно, очень хочется. Но сам JSON по своей сути чувствителен к регистру, так что это может стать довольно запутанным в зависимости от ваших входных данных, и, вероятно, это не очень хорошая идея. – abarnert

0

json.loads() декодировать json в объекты python.[1]

Ваш decoded уже является питонским словарем, но у него нет ключа 0.

Вы можете получить доступ к ссылкам с decoded['Links']

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

+0

Если я пишу print (decoded ['WebID']) Я все еще получаю KeyError: 'WebID'. Что я сделал не так? – JOEMan90

+0

Ах, чувствительный к регистру. Я понял. Спасибо! – JOEMan90

Смежные вопросы