首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何防止python json.loads()不必要地解码字符

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

Stack Overflow用户
提问于 2019-12-30 02:16:46
回答 2查看 622关注 0票数 1

我有一个文件,里面有:

代码语言:javascript
复制
 {
  "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" 
 }

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

代码语言:javascript
复制
 with open('data.txt', 'r') as file:
    data = file.read()

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

代码语言:javascript
复制
  <application>...</application>

如何防止python json.loads破坏内容中的编码?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-12-31 13:29:53

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

代码语言:javascript
复制
>>> 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'}

然后当你做完修改:

代码语言:javascript
复制
>>> 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"}

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

代码语言:javascript
复制
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)))
票数 2
EN

Stack Overflow用户

发布于 2019-12-30 07:09:17

我找到了一个解决办法:

代码语言:javascript
复制
import json
from json.decoder import JSONDecoder

with open('data.txt', 'r') as file:
    data = file.read()    
    data_without_dump = '{"data":\"' + data + '\"}'

    datum_dump = json.dumps(data) 
    datum = '{"data": ' + datum_dump + '}'
    datum_load = json.loads(datum)

    datum_load_without_dump = json.loads(data_without_dump)


print(datum_dump)
print(datum)
print(datum_load["data"])
print(datum_load_without_dump["data"])
print(type(datum_dump), type(datum), type(datum_load))

输出:

代码语言:javascript
复制
"\\u003capplication\\u003e.....\\u003c/application\\u003e"
{"data": "\\u003capplication\\u003e.....\\u003c/application\\u003e"}
\u003capplication\u003e.....\u003c/application\u003e
<application>.....</application>
<class 'str'> <class 'str'> <class 'dict'>

我的推理:

json.loads:将包含JSON文档的str或unicode实例反序列化到Python。json.dumps:将obj序列化为JSON格式的str。

因此,在级联中使用它们可以得到所需的结果。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59524991

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档