orjson 和 json dumps 方法不一样 python3.8

CoN*_*CoN 6 json python-3.x orjson

我已经切换到 orjson 因为它更快,但这导致了我已经有相当长一段时间但从未考虑过的问题。我最终决定进行测试,这些就是我的测试。

\n
import orjson, json\n\n\ndata = json.dumps({"channel_id" : None, "payment_source_id" : None})\nprint(data)\n\ndata = orjson.dumps({"channel_id" : None, "payment_source_id" : None}).decode("utf-8")\nprint(data)\n\n{"channel_id": null, "payment_source_id": null}\n{"channel_id":null,"payment_source_id":null}\n
Run Code Online (Sandbox Code Playgroud)\n

这是我的测试文件。当您运行此命令时,您会发现唯一的区别是 null 和引号之间的空格。当我尝试使用 orjson 转储 json 数据并将其发送到请求中时,我收到 400 错误请求,有时根本没有返回任何内容,但是当尝试使用 json 库时一切正常,我收到有效的响应。我\xe2\x80\x99m 不知道该怎么做,因为就像我说的,唯一的区别是空格。有没有人遇到类似的问题,可以告诉我发生了什么\xe2\x80\x99s 或我做错了什么?另外要注意的是,如果我的代码中没有 \xe2\x80\x9cNone\xe2\x80\x9d ,则 orjson 工作正常。

\n

小智 7

我认为没有什么区别。请检查这个:

import orjson, json

data1 = json.dumps({"channel_id" : None, "payment_source_id" : None})
data2 = orjson.dumps({"channel_id" : None, "payment_source_id" : None}).decode("utf-8")

print(json.loads(data2))
print (orjson.loads(data1))

{'channel_id': None, 'payment_source_id': None}
{'channel_id': None, 'payment_source_id': None}
Run Code Online (Sandbox Code Playgroud)

空格差异仅适用于字符串。如果你加载到json,结果将是相同的。如果在调用 api 时将字符串转换为 json,则可以成功。


小智 6

orjson:通过发出而不是: ,而不是像, 本机json模块默认那样保存一些字节(分隔符后的空格) 。

本机json模块可以选择使用分隔符参数来更改此行为,而orjson则没有。

在我看来,除非您正在测试任何 json 模块生成的内容的正确性,并且应该已经存在于您使用的由其作者编写的模块的测试套件中,否则我可能不会通过断言字节/字符串输出来进行测试。相反 - 正如之前的评论提示 - 在从 json 转换后断言 python 对象内容的全部/部分。如果测试中的任何 json 模块无法反序列化/加载,它无论如何都会失败。

(注意:orjson生成字节,而json生成字符串。)

>>> import orjson
>>> import json
>>> orjson.dumps({"hello":"world"})
b'{"hello":"world"}'
>>> json.dumps({"hello":"world"})
'{"hello": "world"}'
>>>
>>> type(orjson.dumps({"hello":"world"}))
<class 'bytes'>
>>> type(json.dumps({"hello":"world"}))
<class 'str'>
Run Code Online (Sandbox Code Playgroud)
>>> json.dumps({"hello":"world"}, separators=(',', ':'))
'{"hello":"world"}'
>>> orjson.dumps({"hello":"world"}, separators=(',', ':'))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: dumps() got an unexpected keyword argument
Run Code Online (Sandbox Code Playgroud)