我有一个这样格式的字符串:
使用以上编码器,如果输入为:
输出将变为:
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",
}
}
}
}
我在这里提出了一个问题,有人回答使用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)
iterencode
函数时传入了一个未知参数(_one_shot
)。解决方法是在我的iterencode
函数定义中添加**kwargs
作为一个参数。 - JimmyJames