orjson和json转储方法不同于python3.8



我已经切换到orjson,因为它更快,但这导致了一个问题,我已经有相当长的时间了,但从来没有想过。我最终决定做测试,这些就是我的测试。

import orjson, json

data = json.dumps({"channel_id" : None, "payment_source_id" : None})
print(data)
data = orjson.dumps({"channel_id" : None, "payment_source_id" : None}).decode("utf-8")
print(data)
{"channel_id": null, "payment_source_id": null}
{"channel_id":null,"payment_source_id":null}

这是我的测试文件。当你运行这个程序时,你会发现唯一的区别是null和引号之间的空格。当我尝试使用orjson转储json数据并将其发送到请求中时,我会收到一个400错误的请求,有时根本没有得到任何回复,但当尝试使用json-lib时,一切都很好,我会得到一个有效的回复。我不知道该怎么办,因为正如我所说,唯一的区别是空间。有没有人遇到过类似的问题,可以告诉我发生了什么或我做错了什么?另外需要注意的是,如果我的代码中没有"None",那么json也可以正常工作。

我认为没有任何区别。请检查这个:

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}

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

orjson通过发出:而不是:,来保存几个字节(分隔符后的空白(,而不是像本机jsonmodule默认情况下那样发出,

本机json模块可以使用分隔符参数来更改此行为,而

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

(注意:或json产生字节,而json产生strings。(

>>> 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'>
>>> 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

最新更新