Python不解码JSON,因为"encoding"是一个意想不到的参数



我有一个Django 2.2.23应用程序,运行在Python 3.9.4上。我有django扩展2.2.9。

我有一个具有django_extensions.db.fields.json.JSONField属性的模型(AFAIK只是一个自动序列化的文本字段(。我提到这一点是因为当JSON被反序列化时,django扩展库会这样做:

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的记录,因为JSONDecoder无法处理被传递的encoding参数。

我的印象是Python的json库是simplejson。但从源代码来看,它确实处理encoding。但如果我看一下"/usr/local/Cellar/python@3.9/3.9.4/Frameworks/Python.framework/Versions/3.9/lib/python3.9/json/init.py"(如上面错误中所述(,这个解码器肯定不会。

这显然是不正确的行为,但我不知道我需要升级什么才能实现正确的事情。

您看到此错误是因为参数encoding已从Python 3.9中的json.loads中删除(自Python 3.1以来已弃用(。

您正在使用的django扩展2.2.9版本于2020年3月发布,Python 3.9于2020年10月发布。

这个特殊的问题应该在django扩展3.0中得到修复,但Python 3.9只是在django-extensions 3.1.1中添加到测试套件中,所以我建议更新到最新版本。

由于encoding参数已弃用,您可以尝试执行以下操作:

def loads(txt):
txt = txt.encode("utf-8")
value = json.loads(txt)
return value

最新更新