为什么python3不加载这个json字符串?

Mat*_*ell 0 python encoding json utf-8 python-3.x

我有一串

b'{"nonce":"820346305172674795","hash":"CF9558F1AC5AA3F4F3D598BAD50D8E0FD15E536A98095C01AD1BA962BDF342D0E37CF6ED595758B3217CA1986238B10EB729D5C5EBCE1523B41328365E936DBE","encryptedMessage":"ABF47CA76B72388B3CA8F4BF95D199D02835C5AED546CC6A6A35663C312093DB05E3765A00211242770136D7F2391A2A69CCA28B4D9695","signature":"09036C211B6386AD0B1D7EDA14AE4C4C77721916C9AF48E7141049E2773098665776AA4B7CC6E12B4B5BD1FBB3B590F41C6254313BAEBA9293D87769F1A4200468747470733A2F2F3139322E3136382E312E38343A353030302F746F67676C655F646F6F722431"}'
Run Code Online (Sandbox Code Playgroud)

那就是print(str(json_string))输出

当我尝试时json.loads(json_string),它说它不能是字节数组,必须是字符串

当我尝试json时。

idj*_*jaw 5

您需要解码字节字符串,以便json可以加载它。查看的代码json.loads,它具有以下异常检查:

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

如果您进入解释器并进行测试,则将在发送字节字符串时看到预期的异常:

>>> a = b'abc'
>>> type(a)
<class 'bytes'>
>>> b = b'abc'.decode('utf-8')
>>> type(b)
<class 'str'>
Run Code Online (Sandbox Code Playgroud)

因此,试图调用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'
>>>
Run Code Online (Sandbox Code Playgroud)

因此,在这种情况下,您的解决方案是使用 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)
Run Code Online (Sandbox Code Playgroud)

输出:

u'nonce': u'820346305172674795', u'hash': u'CF9558F1AC5AA3F4F3D598BAD50D8E0FD15E536A98095C01AD1BA962BDF342D0E37CF6ED595758B3217CA1986238B10EB729D5C5EBCE1523B41328365E936DBE', u'encryptedMessage': u'ABF47CA76B72388B3CA8F4BF95D199D02835C5AED546CC6A6A35663C312093DB05E3765A00211242770136D7F2391A2A69CCA28B4D9695', u'signature': u'09036C211B6386AD0B1D7EDA14AE4C4C77721916C9AF48E7141049E2773098665776AA4B7CC6E12B4B5BD1FBB3B590F41C6254313BAEBA9293D87769F1A4200468747470733A2F2F3139322E3136382E312E38343A353030302F746F67676C655F646F6F722431'}
Run Code Online (Sandbox Code Playgroud)

  • 我提供的答案全部在Python 3.5中完成。我不知道你在说什么。 (4认同)