Python 重命名JSON密钥名
我收到一个JSON对象,如下所示:Python 重命名JSON密钥名,python,json,Python,Json,我收到一个JSON对象,如下所示: { "Question Communicating": "Natural language", "interpretation_type": "recognition", "output1": "test", "Question Learning": "Reinforcement", "output2": "test2", "output3": "something" } 我的问题是,是否可以将密钥名:'out
{
"Question Communicating": "Natural language",
"interpretation_type": "recognition",
"output1": "test",
"Question Learning": "Reinforcement",
"output2": "test2",
"output3": "something"
}
我的问题是,是否可以将密钥名:'outputX'
重命名为'output'
。
我不知道JSON中会出现多少次'outputX'
,但我需要将所有输出重命名为'output'
。
所以结果会是这样的:
{
"Question Communicating": "Natural language",
"interpretation_type": "recognition",
"output": "test",
"Question Learning": "Reinforcement",
"output": "test2",
"output": "something"
}
不建议尝试在JSON对象中使用重复键。您可以看到在序列化和反序列化重复键或尝试将它们强制放入字典时出现的问题。不会保留重复的密钥
>>> from json import dumps, loads
>>> json = '{"a": "x", "a": "y"}'
>>> loads(json)
{'a': 'y'}
>>> json = {'a': 'x', 'a': 'y'}
>>> dumps(json)
'{"a": "y"}'
>>> json = {'a': 'x', 'a': 'y'}
>>> json
{'a': 'y'}
相反,您可以尝试将所有以“output”
开头的键分组到一个列表[“test”、“test2”、“something”]
输出JSON:
{
"Question Communicating": "Natural language",
"interpretation_type": "recognition",
"output": [
"test",
"test2",
"something"
],
"Question Learning": "Reinforcement"
}
一种可能是使用允许重复键的数据结构,例如
webob.multidict.multidict
import webob.multidict
import json
class MultiDictEncoder(json.JSONEncoder):
def default(self, o):
if isinstance(o, webob.multidict.MultiDict):
return o
else:
return super().default(o)
def encode(self, o):
if isinstance(o, webob.multidict.MultiDict):
# Just a proof of concept. No attempt is made
# to properly encode keys for values.
return ('{'
+ ', '.join(f'"{k}": "{v}"' for k, v in o.items())
+ '}')
else:
return super().encode(o)
with open("tmp1.json") as f:
input_data = json.load(f)
output_data = webob.multidict.MultiDict()
for k, v in input_data.items():
if k.startswith("output"):
k = 'output'
output_data.add(k, v)
with open("tmp2.json", 'w') as f:
print(json.dumps(output_data, cls=MultiDictEncoder), file=f)
出于某种原因,在测试时,使用
json.dump
产生了一个涉及循环引用的错误。我不知道我如何定义MultiDictEncoder.default
,这是否是一个问题,但生成的tmp2.json
确实有重复的输出
键。对象中不能有重复的键。您可以使用这三个值创建一个列表。output
。您需要将它们组合成一个属性,如“output”:[“test”、“test2”、“something”]
这是json格式的,但不推荐使用。好的,但是,对于如何检查包含单词output
的所有键名,并将值放在一个括号中,然后在删除其他键的同时将其放回json对象,您有什么建议吗?如果有某种python串行解析器,您可以匹配“output*”
键并在输出流中替换它们。
import webob.multidict
import json
class MultiDictEncoder(json.JSONEncoder):
def default(self, o):
if isinstance(o, webob.multidict.MultiDict):
return o
else:
return super().default(o)
def encode(self, o):
if isinstance(o, webob.multidict.MultiDict):
# Just a proof of concept. No attempt is made
# to properly encode keys for values.
return ('{'
+ ', '.join(f'"{k}": "{v}"' for k, v in o.items())
+ '}')
else:
return super().encode(o)
with open("tmp1.json") as f:
input_data = json.load(f)
output_data = webob.multidict.MultiDict()
for k, v in input_data.items():
if k.startswith("output"):
k = 'output'
output_data.add(k, v)
with open("tmp2.json", 'w') as f:
print(json.dumps(output_data, cls=MultiDictEncoder), file=f)