我需要一个函数来解码 UTF-8 编码的 JSON。此函数应采用 UTF-8 编码的 JSON 字符串并将其转换为 UTF-8 编码的对象。以下代码有效:
# helper function
def Obj_To_UTF8(o):
res = {}
for k, v in o.items():
k = k.encode('utf-8')
v = v.encode('utf-8') if isinstance(v, unicode) else v
res[k] = v
return res
# Load UTF-8 encoded JSON to UTF-8 encoded objects
def Load_JSON(s):
return json.loads(s, object_hook = Obj_To_UTF8)
但是相当荒谬,因为
json.loads
正在解码 UTF-8,以便我们可以再次对其进行编码。如何在不解码其中的 UTF-8 的情况下解码 JSON?
虽然我不可能推荐这个“解决方案”,但您已经在使用不受支持的语言
如果您正在开发新代码,请停下来考虑一下您是否遇到 XY 问题,以及您是否至少可以将您正在做的任何事情包装在 Python 3 的
subproces
中以开始摆脱它
也就是说,你也许可以利用我的疯狂邪恶解决方案来解决另一个问题并直接将JSON解释为Python字典
强制性注意事项
test.json
{
"1": "➀"
}
test.py
# -*- coding: utf-8 -*-
def thisisterribledonotdothis(path):
with open(path) as fh:
exec("null=None;true=True;false=False;d={}".format(fh.read()))
return locals()["d"]
import sys
d = thisisterribledonotdothis(sys.argv[1])
print(d)
% docker run --rm -it -v .:/root/mount python:2.7 python2 /root/mount/test.py /root/mount/test.json
{'1': '\xe2\x9e\x80'}
进一步说明和注意事项
coding
线的情况下工作,但是 ymmvpython:2.7
容器,虽然只是为了展示它是如何工作的,但确实是古老,并且具有字面上的数百个已知漏洞,要在其中工作,请考虑使用以下内容制作自己的容器:最少远程支持,如 Ubuntu 16.04