gpt4 book ai didi

python - json 编码器 json.dump 和 json.dumps 的不同结果

转载 作者:太空宇宙 更新时间:2023-11-04 09:38:01 27 4
gpt4 key购买 nike

我有一个这种格式的字符串,

d = {'details': {'hawk_branch': {'tandem': ['4210bnd72']}, 'uclif_branch': {'tandem': ['e2nc712nma89', '23s24212', '12338cm82']}}}

我想以这种格式将它写入文件,将列表转换为字典并添加单词 value 作为列表中每个值的键,所以 {'tandem': ['4210bnd72']} 应该变成

  "tandem": {
"value": "4210bnd72"
}

这是预期的输出文件,

{
"details": {

"hawk_branch": {
"tandem": {
"value": "4210bnd72"
}
},
"uclif_branch": {
"tandem": {
"value": "e2nc712nma89",
"value": "23s24212",
"value": "12338cm82",
}
}
}
}

我问了一个问题here有人回答使用 json.JSONEncoder,

class restore_value(json.JSONEncoder):
def encode(self, o):
if isinstance(o, dict):
return '{%s}' % ', '.join(': '.join((json.encoder.py_encode_basestring(k), self.encode(v))) for k, v in o.items())
if isinstance(o, list):
return '{%s}' % ', '.join('"value": %s' % self.encode(v) for v in o)
return super().encode(o)

使用上面的编码器,如果输入是,

d = {'details': {'hawk_branch': {'tandem': ['4210bnd72']}, 'uclif_branch': {'tandem': ['e2nc712nma89', '23s24212', '12338cm82']}}}

输出会变成,

print(json.dumps(d, cls=restore_value))
{"details": {"hawk_branch": {"tandem": {"value": "4210bnd72"}}, "uclif_branch": {"tandem": {"value": "e2nc712nma89", "value": "23s24212", "value": "12338cm82"}}}}

这正是我想要的,但现在我想将它写入文件。

with open("a.json", "w") as f:
json.dump(d, f, cls=restore_value)

但是它的写法和json.dumps的输出方式不一样。

预期输出,

{"details": {"hawk_branch": {"tandem": {"value": "4210bnd72"}}, "uclif_branch": {"tandem": {"value": "e2nc712nma89", "value": "23s24212", "value": "12338cm82"}}}}

我得到的输出,

{"details": {"hawk_branch": {"tandem": ["4210bnd72"]}, "uclif_branch": {"tandem": ["e2nc712nma89", "23s24212", "12338cm82"]}}}

有人能告诉我为什么即使我使用编码器它写入文件的方式不同吗?

复制,

使用 python 3 复制并运行它,

import json


class restore_value(json.JSONEncoder):
def encode(self, o):
if isinstance(o, dict):
return '{%s}' % ', '.join(': '.join((json.encoder.py_encode_basestring(k), self.encode(v))) for k, v in o.items())
if isinstance(o, list):
return '{%s}' % ', '.join('"value": %s' % self.encode(v) for v in o)
return super().encode(o)

d = {'details': {'hawk_branch': {'tandem': ['4210bnd72']}, 'uclif_branch': {'tandem': ['e2nc712nma89', '23s24212', '12338cm82']}}}
print(json.dumps(d, cls=restore_value))


with open("a.json", "w") as f:
json.dump(d, f, cls=restore_value)

最佳答案

原因在这里:

如果您在 github 的 CPython/Lib/json 中查看 json.__init__.py 的源代码:https://github.com/python/cpython/blob/master/Lib/json/init.py

你会发现 json.dump 实际上使用:

if (not skipkeys and ensure_ascii and
check_circular and allow_nan and
cls is None and indent is None and separators is None and
default is None and not sort_keys and not kw):
iterable = _default_encoder.iterencode(obj)
else:
if cls is None:
cls = JSONEncoder
iterable = cls(skipkeys=skipkeys, ensure_ascii=ensure_ascii,
check_circular=check_circular, allow_nan=allow_nan, indent=indent,
separators=separators,
default=default, sort_keys=sort_keys, **kw).iterencode(obj)
# could accelerate with writelines in some versions of Python, at
# a debuggability cost
for chunk in iterable:
fp.write(chunk)

因此,您想要覆盖的函数应该是json.JSONEncoder.iterencode而不是encode

关于python - json 编码器 json.dump 和 json.dumps 的不同结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52939176/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com