![](/img/trans.png)
[英]How do I use simplejson to decode JSON responses to python objects?
[英]How might I persuade Kombu to use simplejson instead of the json module?
有什么好的方法可以说服Celery+Kombu 使用simplejson 而不是标准库的json 模块吗?
我上线了:
tact@tact_pub_api:/app$ python3.10 -m pip list -v | egrep -i 'celery|kombu'
celery 5.2.3 /usr/local/lib/python3.10/site-packages pip
kombu 5.2.4 /usr/local/lib/python3.10/site-packages pip
tact@tact_pub_api:/app$ python2.7 -m pip list -v | egrep -i 'celery|kombu'
DEPRECATION: Python 2.7 reached the end of its life on January 1st, 2020. Please upgrade your Python as Python 2.7 is no longer maintained. pip 21.0 will drop support for Python 2.7 in January 2021. More details about Python 2 support in pip can be found at https://pip.pypa.io/en/latest/development/release-process/#python-2-support pip 21.0 will remove support for this functionality.
celery 3.1.26.post2 /usr/local/lib/python2.7/dist-packages pip
kombu 3.0.37 /usr/local/lib/python2.7/dist-packages pip
...我得到了回溯:
Traceback (most recent call last):
File "/usr/local/lib/python3.10/site-packages/kombu/serialization.py", line 39, in _reraise_errors
yield
File "/usr/local/lib/python3.10/site-packages/kombu/serialization.py", line 210, in dumps
payload = encoder(data)
File "/usr/local/lib/python3.10/site-packages/kombu/utils/json.py", line 68, in dumps
return _dumps(s, cls=cls or _default_encoder,
File "/usr/local/lib/python3.10/json/__init__.py", line 238, in dumps
**kw).encode(obj)
File "/usr/local/lib/python3.10/json/encoder.py", line 199, in encode
chunks = self.iterencode(o, _one_shot=True)
File "/usr/local/lib/python3.10/json/encoder.py", line 257, in iterencode
return _iterencode(o, 0)
File "/usr/local/lib/python3.10/site-packages/kombu/utils/json.py", line 58, in default
return super().default(o)
File "/usr/local/lib/python3.10/json/encoder.py", line 179, in default
raise TypeError(f'Object of type {o.__class__.__name__} '
TypeError: Object of type bytes is not JSON serializable
我听到的是,这是由使用 python 标准库的 json 模块而不是 pypi 的 simplejson 模块( https://docs.celeryq.dev/projects/kombu/en/stable/changelog.html #rc1 )。 显然,标准库的“json”模块不能(反)序列化字节,但 pypi 的“simplejson”可以。 旧版本的 Celery+Kombu 默认使用 simplejson。
例如:
>>> import json
>>> s = b'abc'
>>> json.dumps(s)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/local/lib/python3.10/json/__init__.py", line 231, in dumps
return _default_encoder.encode(obj)
File "/usr/local/lib/python3.10/json/encoder.py", line 199, in encode
chunks = self.iterencode(o, _one_shot=True)
File "/usr/local/lib/python3.10/json/encoder.py", line 257, in iterencode
return _iterencode(o, 0)
File "/usr/local/lib/python3.10/json/encoder.py", line 179, in default
raise TypeError(f'Object of type {o.__class__.__name__} '
TypeError: Object of type bytes is not JSON serializable
我的团队/项目最终可能希望也可能不希望移动到 json 模块的序列化,但就目前而言,为了互操作性使用 simplejson 似乎是最有意义的。
(这是较大的 CPython 2.7 -> CPython 3.10 端口的一部分;我只想首先在 3.10 上运行,然后担心更新依赖项以使其成为现代的。现在,客户端和服务器位于不同版本的 celery 和 kombu )
谢谢!
也许你可以从你的代码中使用 monkeypatch kombu,在导入它之后,使用 simplejson 而不是 json。从上面的回溯:
File "/usr/local/lib/python3.10/site-packages/kombu/serialization.py", line 210, in dumps
payload = encoder(data)
如果encoder
是一个全局名称, kombu.encoder
重新绑定为使用 simplejson 的 function。 如果不是,但dumps
是,重新绑定kombu.dumps
。
或者,这一对
File "/usr/local/lib/python3.10/site-packages/kombu/utils/json.py", line 68, in dumps
return _dumps(s, cls=cls or _default_encoder,
建议您可以将kombu.utils.json.cls
设置为 None 以外的其他内容以更改行为。 检查 kombu 文档或阅读模块代码。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.