2016-04-22 3 views
0

У меня есть строкаПочему python3 не загружает эту строку json?

b'{"nonce":"820346305172674795","hash":"CF9558F1AC5AA3F4F3D598BAD50D8E0FD15E536A98095C01AD1BA962BDF342D0E37CF6ED595758B3217CA1986238B10EB729D5C5EBCE1523B41328365E936DBE","encryptedMessage":"ABF47CA76B72388B3CA8F4BF95D199D02835C5AED546CC6A6A35663C312093DB05E3765A00211242770136D7F2391A2A69CCA28B4D9695","signature":"09036C211B6386AD0B1D7EDA14AE4C4C77721916C9AF48E7141049E2773098665776AA4B7CC6E12B4B5BD1FBB3B590F41C6254313BAEBA9293D87769F1A4200468747470733A2F2F3139322E3136382E312E38343A353030302F746F67676C655F646F6F722431"}' 

, который является print(str(json_string)) OUTPUT

, когда я пытаюсь json.loads(json_string), он говорит, что не может быть массив, должен быть строкой

Когда я пытаюсь JSON ,

+3

попробовать 'json.load (json_string.decode ('UTF-8'))'. '' 'Фронт указывает, что это массив байтов. –

+0

Я нахожусь на python3. –

+0

Вы пробовали? –

ответ

4

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

if not isinstance(s, str): 
     raise TypeError('the JSON object must be str, not {!r}'.format(
          s.__class__.__name__)) 

Если вы идете в свой интерпретатор и сделать тест, вы будете видеть исключение, как ожидается, при передаче байта строки:

>>> a = b'abc' 
>>> type(a) 
<class 'bytes'> 
>>> b = b'abc'.decode('utf-8') 
>>> type(b) 
<class 'str'> 

Таким образом, пытаясь вызвать json.load с a:

>>> json.loads(a) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/json/__init__.py", line 312, in loads 
    s.__class__.__name__)) 
TypeError: the JSON object must be str, not 'bytes' 
>>> 

Итак, ваше решение в этом случае для декодирования с utf-8

import json 

data = b'{"nonce":"820346305172674795","hash":"CF9558F1AC5AA3F4F3D598BAD50D8E0FD15E536A98095C01AD1BA962BDF342D0E37CF6ED595758B3217CA1986238B10EB729D5C5EBCE1523B41328365E936DBE","encryptedMessage":"ABF47CA76B72388B3CA8F4BF95D199D02835C5AED546CC6A6A35663C312093DB05E3765A00211242770136D7F2391A2A69CCA28B4D9695","signature":"09036C211B6386AD0B1D7EDA14AE4C4C77721916C9AF48E7141049E2773098665776AA4B7CC6E12B4B5BD1FBB3B590F41C6254313BAEBA9293D87769F1A4200468747470733A2F2F3139322E3136382E312E38343A353030302F746F67676C655F646F6F722431"}' 

decoded_data = data.decode('utf-8') 
json_data = json.loads(decoded_data) 

Выход:

u'nonce': u'820346305172674795', u'hash': u'CF9558F1AC5AA3F4F3D598BAD50D8E0FD15E536A98095C01AD1BA962BDF342D0E37CF6ED595758B3217CA1986238B10EB729D5C5EBCE1523B41328365E936DBE', u'encryptedMessage': u'ABF47CA76B72388B3CA8F4BF95D199D02835C5AED546CC6A6A35663C312093DB05E3765A00211242770136D7F2391A2A69CCA28B4D9695', u'signature': u'09036C211B6386AD0B1D7EDA14AE4C4C77721916C9AF48E7141049E2773098665776AA4B7CC6E12B4B5BD1FBB3B590F41C6254313BAEBA9293D87769F1A4200468747470733A2F2F3139322E3136382E312E38343A353030302F746F67676C655F646F6F722431'} 
+0

У python3 нет data.decode. Я использую codecs.decode (строка, «utf-8»), а затем загружаю его в json.loads. Нет кубиков –

+4

Ответ, который я предоставил, был сделан на Python 3.5. Я понятия не имею, о чем вы говорите. – idjaw

+1

Я принимаю это. Я понятия не имею, он определенно НЕ работал раньше. Я совершенно незнакомый с python, не уверен, что я сделал не так. Спасибо, сейчас работает. –

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