【问题标题】:I couldn't convert a str to json in python我无法在 python 中将字符串转换为 json
【发布时间】:2021-07-30 14:04:13
【问题描述】:

我收到错误 Traceback(最近一次调用最后一次):json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)

我的代码: ```

HOST = '0.0.0.0'
PORT = 10001

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.bind((HOST, PORT))
    s.listen()
    conn, addr = s.accept()
    with conn:
        print('Connected by', addr)
        while True:
            dataByte = conn.recv(1024)
            if not dataByte: 
                print("Not data")
            myStr = dataByte.decode('utf-8').replace("'", '"')
        
            data = json.loads(myStr)
            s = json.dumps(data, indent=4, sort_keys=True)
            print(s)
```

原始数据字节 b'POST / HTTP/1.1\r\nHost: localhost:10001\r\nUser-Agent: Go-http-client/1.1\r\nContent-Length: 3153\r\nContent-Type: application/json\r\ nAccept-Encoding: gzip\r\n\r\n{"Event":"error","S":"0\ufffd\u000380\ufffd\u0002 \ufffd\u0003\u0002\u0001\u0002\u0002\u0014 \u0018DIv\ufffd\ufffd\xca\xb9\ufffd\ufffd\ufffd\ufffdSJa~\ufffd\ufffd\ufffd10\r\u0006\t*\ufffdH\ufffd\ufffd\r\u0001\u0001\u000b\u0005\u00000O1 \ u000b0 \ u0006 \ u0004 \ u0004 \ u000013 \ u0002br1 \ u0002br1 \ u00000 \ u0006 \ u0002 \ u0006 \ u0003u \ u0006 \ u0008 \ u000c \ u0005aaaaaa1 \ r0 \ u000b \ u0006 \ u0003u \ u0004 \ u0007 \ u000c \ u0004bbb1!0 \ u001f \ u0006 \ u0003u \ u0004 \ n \ u000c \ u0018 internet widgits pty ltd0 \ u001e \ u0017 \ r210524192942z \ u0017 \ r230827192942z0!1 \ u0003u \ r2306 \ u0003u \ u0004 \ u0006 \ u0013 \ u0002gb1 \ u00120 \ u0010 \ u0006\u0003U\u0004\u0003\u000c\tlocalhost0\ufffd\u0001\"0\r\u0006\t*\ufffdH\ufffd\ufffd\r\u0001\u0001\u0001\u0005\u0000\u0003\ufffd\u0001\ u000f\u00000\ufffd\u0001\n\u0002\ufffd\u0001\u0001\u0000\ufffdy\u0017\u0012|\ufffd\u0007\ufffd\u0006\ufffdwl\ufffd\ufffd\ufff dhu\ufffdAP\u000e\ufffd\ufffda\ufffd\u' b'0016\ufffdU\ufffdp\ufffd?\ufffd\ufffd\ufffdq2\u0000\ufffd\ufffd\ufffd9\ufffd\x7f\ufffd\ufffd\ufffd\ufffd%\ufffd\ufffd\ufffd\ufffd^B\ufffd\ u0026*\ufffd\ufffd\ufffd\ufffd+\xd7\x98\ufffd\ufffdHw\ufffdl\ufffd\ufffd\ufffd\ufffd\xe3\x90\x95u\ufffdV\ufffd\xd6\x9d\ufffd\u0000d\ufffd\ufffd \xcd\x92\ufffd\u003c\ufffd\ufffd\ufffd\ufffdn%\ufffd-\u001e\ufffd\u00140ml\u0013A\ufffd#\ufffdr0$=\ufffd\ufffd\ufffd\ufffdr\ufffd\ufffd\ufffd\ ufffd_|\ufffd\ufffd\ufffd\ufffdM\ufffd\t\ufffdK~\ufffdZ\ufffd\ufffd8\xd7\x9d\u0003\xc5\xb0\ufffdo\ufffd\ufffd\ufffd3\xca\x882\u003e\ufffd\ x7fj\ufffdc\ufffd\ufffdtuW\ufffdp\ufffd\ufffd\xcd\xaa.lc\ufffd\ufffd\ufffd\u00058\u001c\u001a,th3D4m\ufffd\u000b(\u0026\ufffdq\ufffd{\ufffd\ufffd\ ufffd\ufffd.\u003c\u000c\u003c\ufffd[)\xd2\x92\ufffd]\ufffd\ufffd\u0019t\u001e;E\ufffd%\ufffd\"\ufffd\ufffdM\ufffd/\u0001w\ufffdZ\ u000c\ufffd\xc8\x85b\ufffdR\ufffdaT\ufffdVu\ufffd+\ufffd\ufffdU\ufffd;\u0019O\u0011\u0002\u0003\u0001\u0000\u0001\ufffd:080\u000b\u0006\u0003U\u \u0004\ u0004\u0003\u0002\u000400\u0013\u0006\u0003U\u001d%\u0004\u000c0\n\u0006\u0008+\u0006\u0001\u00' b'05\u0005\u0007\u0003\u00020\u0014\u0006\u0003U\u001d\u0011\u0004\r0\u000b\ufffd\tlocalhost0\r\u0006\t*\ufffdH\ufffd\ufffd\r\u0001\u0001 \u000b\u0005\u0000\u0003\ufffd\u0001\u0001\u0000\ufffdV\ufffd.\ufffdT\ufffdl\ufffd\ufffd_\xd9\x93\u0015\ufffd\ufffdqJ\ufffd\ufffd\ufffd9\ufffdW\ufffd\ u00105\xdc\xa2\ufffd\ufffd:\ufffd\ufffdyBTJ\ufffd\ufffdF\ufffd\u0003\ufffd\ufffd\u001a#\ufffd\u0018\u0014S(C\ufffd\ufffd\ufffd\u000cWY\u0018\ufffd\ u0026]\ufffd!6\ufffd\ufffd\ufffd}\ufffd\u0000Q\ufffd\ufffdF\u0001\ufffd\ufffd)\xd7\xb1\u001ar\ufffd\ufffdF\ufffd4y\u0007\ufffd\u0004\ufffd\u001b \ufffd@\ufffd\u0018\ufffdh\ufffdW\ufffd}\ufffd:\ufffdD\ufffd\ufffdAY\ufffd\ufffdK\ufffd\ufffdP\ufffd\ufffdB\u0008\ufffd\ufffdV+\ufffdo\ufffd\ufffd\ufffd\ ufffd\ufffd\xd4\x89itCP\ufffd?\ufffd\ufffd\ufffd\u0002\ufffdZ\u0010\ufffd04\x7fIR\ufffd\ufffd\ufffd\ufffd%;D\ufffd\ufffd\u001d\ufffdUrB\ufffd)z\ ufffdZ\ufffdb\ufffd\ufffd\ufffd\ufffd\ufffd\xce\xba\ufffdE\xde\xa5\ufffd\u000f\ufffd\ufffdOx\ufffdi\ufffd%\x7f\u0014\ufffd\uf ffd\ufffdZ\ufffd\ufffd\ufffdC\ufffduj\ufffd\ufffd\ufffd\u001c\nmAt\u' b'fffd\ufffd\u001e\ufffd]\"XWX\ufffdv}\ufffd\ufffd\ufffdT9@HP\ufffd\ufffd\u001c\ufffd\ufffdF\u0004\ufffd$F\xce\x8b\ufffd\ufffd\ufffd \ufffd\ufffdI","Message":"发生错误:ERROR 505"}'

我的字符串 {"事件":"错误","S":"0\ufffd\u000380\ufffd\u0002\ufffd\u0003\u0002\u0001\u0002\u0002\u0014\u0018DIv\ufffd\ufffdʹ\ufffd\ufffd\ufffd\ ufffdSJa~\ufffd\ufffd\ufffd10\r\u0006\t*\ufffdH\ufffd\ufffd\r\u0001\u0001\u000b\u0005\u00000O1\u000b0\t\u0006\u0003U\u0004\u0006\u0013\u0002 u000e0 \ u000c \ u0006 \ u0003u \ u0004 \ u0008 \ u000c \ u0005aaaaaa1 \ r0 \ u000b \ u0006 \ u0007 \ u0004 \ u0007 \ u000c \ u0004bbbb1!0 \ u001f \ u0006 \ u0003u \ u0004 \ n \ u000c \ u0018i \ ufffdi“ ,"Message":"发生错误:ERROR 505"}

【问题讨论】:

  • 在尝试转换之前检查myStr,它可能是空的...
  • 不为空。
  • 用" 替换' 以生成有效的JSON 充其量是脆弱的。如果您确实收到 Python dict 文字,请改用 ast.literal_eval(或者更好的是,修复发件人以发送正确的 JSON)。
  • 顺便说一句,if not dataByte: 表示连接已关闭,您将永远不会再收到数据。现在是跳出循环的好时机。
  • dataByte 真的是 UTF-8 编码的,还是 UTF-16 编码的?目前尚不清楚所有这些 \ufffd 字符是否是生成的“JSON”中的文字 6 字节序列,或者它们是否是 bytes 值的 Python 表示的一部分。

标签: python json python-3.x jsonencoder


【解决方案1】:

您的字符串似乎包含损坏的 Unicode 转义符。转义符 \u 后跟 四个 字符编码代码点,因此,例如,\u000380 被解析为 \u0003(又名 ascii Control-C)后跟普通数字 "80" .

无论如何,当我尝试重现您的问题时,我得到的错误与您所做的不同:

json.decoder.JSONDecodeError:无效控制字符在:第 1 行第 25 列(字符 24)

由于不知道还会发生什么,请创建一个包含您尝试解析的响应数据的测试字符串,并将其嵌入到您的 Python 代码中(编辑您的问题,不要'不要尝试在评论中这样做)。

我们只需要包含数据字符串和json.loads() 调用...以及错误消息的代码。那么我们也许能够看到你所看到的,并取得进展。

【讨论】:

    猜你喜欢
    • 2016-10-01
    • 2016-01-23
    • 1970-01-01
    • 2016-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-11
    相关资源
    最近更新 更多