Python不解码JSON,因为“编码”是一个意想不到的参数
我有一个 Django 2.2.23 应用程序,在 Python 3.9.4 上运行。我有 django-extensions 2.2.9。
我有一个具有django_extensions.db.fields.json.JSONField属性的模型(AFAIK,它只是一个自动序列化的文本字段)。我提到这一点是因为当 JSON 被反序列化时,django-extensions 库会这样做:
def loads(txt):
value = json.loads(
txt,
encoding=settings.DEFAULT_CHARSET
)
return value
问题是导入的库import json在以这种方式调用时给了我一个错误:
Python 3.9.4 (default, Apr 5 2021, 01:50:46)
[Clang 12.0.0 (clang-1200.0.32.29)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import json
>>> json.loads("{}", encoding="UTF-8")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/local/Cellar/python@3.9/3.9.4/Frameworks/Python.framework/Versions/3.9/lib/python3.9/json/__init__.py", line 359, in loads
return cls(**kw).decode(s)
TypeError: __init__() got an unexpected keyword argument 'encoding'
>>>
最终结果是我无法JSONField从数据库加载任何包含 a 的记录,因为 JSONDecoder 无法处理传递的encoding参数。
我的印象是 Python 的 json 库是 simplejson。但是查看它的来源,它确实处理encoding. 但是,如果我看的JSON库“/usr/local/Cellar/python@3.9/3.9.4/Frameworks/Python.framework/Versions/3.9/lib/python3.9/json/初始化的.py”(如指定在上面的错误中),这个解码器绝对没有。
这显然是不正确的行为,但我不知道我需要升级什么才能使正确的事情发生。
回答
您看到此错误是因为该参数encoding已从json.loadsPython 3.9 中删除(自 Python 3.1 起已弃用)。
您使用的版本django-extensions 2.2.9于2020年3月发布,Python 3.9于2020年10月发布。
这个特殊问题应该在 django-extensions 3.0 中修复,但是 Python 3.9 只被添加到 django-extensions 3.1.1 的测试套件中,所以我建议更新到最新版本。