python - 如何防止 python json.loads() 不必要地解码字符

标签 python json

我有一个文件,其中包含:

 {
  "name": "HOSTNAME_HTTP",
  "description": "Custom hostname for http service route.  Leave blank for default hostname, e.g.: \u003capplication-name\u003e-\u003cproject\u003e.\u003cdefault-domain-suffix\u003e" 
 }

当我使用以下方式打开文件时:

 with open('data.txt', 'r') as file:
    data = file.read()

我将其传递给 json.loads 并将数据中的内容替换为:

  <application>...</application>

如何防止 python json.loads 弄乱内容中的编码?

最佳答案

您可以使用这样的解决方法来转义 unicode 序列:

>>> obj = json.loads(data.replace('\\', '\\\\'))
>>> obj
{'name': 'HOSTNAME_HTTP',
 'description': 'Custom hostname for http service route.  Leave blank for default hostname, e.g.: \\u003capplication-name\\u003e-\\u003cproject\\u003e.\\u003cdefault-domain-suffix\\u003e'}

完成修改后:

>>> print(json.dumps(obj).replace('\\\\', '\\'))
{"name": "HOSTNAME_HTTP", "description": "Custom hostname for http service route.  Leave blank for default hostname, e.g.: \u003capplication-name\u003e-\u003cproject\u003e.\u003cdefault-domain-suffix\u003e"}

如果您希望文件中存在其他反斜杠,那么使用正则表达式会更安全:

import re

from_pattern = re.compile(r'(\\u[0-9a-fA-F]{4})')
to_pattern = re.compile(r'\\(\\u[0-9a-fA-F]{4})')

def from_json_escaped(path):
    with open(path, 'r') as f:
        return json.loads(from_pattern.sub(r'\\\1', f.read()))

def to_json_escaped(path, obj):
    with open(path, 'w') as f:
        f.write(to_pattern.sub(r'\1', json.dumps(obj)))

关于python - 如何防止 python json.loads() 不必要地解码字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59524991/

相关文章:

python - MySQL 连接器 python 35 大型查询资源暂时不可用?

python - Python中是否有类似于matlab中的 'which'和 'open'的函数?

python - 已知短语前后的正则表达式条件

javascript - 为什么JSON数据插入不正确

c++ - 渲染二维元素的引用(圆形、圆角矩形、模糊~)

python - 从 Flask View 返回任意对象

ruby-on-rails - 在ActiveModel::Serializer中序列化错误哈希

json - 使用未解析的标识符

json.Unmarshal 忽略 json 字符串中的 json 字符串值,不要尝试解析它

PYTHON for 循环通过 dict_keys 和 UDP 发送