python2.7 - 如何解码 JSON 而不解码其中的 UTF-8?

问题描述 投票:0回答:1

我需要一个函数来解码 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?

json python-2.7 utf-8
1个回答
0
投票

虽然我不可能推荐这个“解决方案”,但您已经在使用不受支持的语言

如果您正在开发新代码,请停下来考虑一下您是否遇到 XY 问题,以及您是否至少可以将您正在做的任何事情包装在 Python 3 的

subproces
中以开始摆脱它

也就是说,你也许可以利用我的疯狂邪恶解决方案来解决另一个问题并直接将JSON解释为Python字典

强制性注意事项

  • 这可以并且将会执行传递的文件路径中的任何内容,这可能会执行用户下运行的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
    线的情况下工作,但是 ymmv
  • 上面的“官方”
    python:2.7
    容器,虽然只是为了展示它是如何工作的,但确实是
    古老,并且具有字面上的数百个已知漏洞,要在其中工作,请考虑使用以下内容制作自己的容器:最少远程支持,如 Ubuntu 16.04
  • 迁移到 Python 3 的一个主要原因是字符串与字节相比以及整体 unicode 处理要好得多
© www.soinside.com 2019 - 2024. All rights reserved.