我有json文件,它有重复的键。
实施例
{
"data":"abc",
"data":"xyz"
}
我想这样做 { “DATA1”: “ABC”, “DATA2”: “XYZ” }
我尝试将object_pairs_hook与json_loads一起使用,但它无效。任何人都可以帮我解决上述问题的Python解决方案
答案 0 :(得分:1)
您可以通过load
方法传递关键字参数来处理配对,在那里您可以检查重复项,如下所示:
raw_text_data = """{
"data":"abc",
"data":"xyz",
"data":"xyz22"
}"""
def manage_duplicates(pairs):
d = {}
k_counter = Counter(defaultdict(int))
for k, v in pairs:
d[k+str(k_counter[k])] = v
k_counter[k] += 1
return d
print(json.loads(raw_text_data, object_pairs_hook=manage_duplicates))
我使用Counter
来计算每个密钥,如果它已经存在,我将密钥保存为k+str(k_counter[k)
- 所以它将添加一个尾随编号。
<强> P.S 强>
如果您对输入有控制权,我强烈建议您将json结构更改为:
{"data": ["abc", "xyz"]}
The rfc 4627 for application/json
media type建议使用唯一键,但不明确禁止它们:
对象中的名称应该是唯一的。
答案 1 :(得分:0)
使用re
快速而肮脏的解决方案。
import re
s = '{ "data":"abc", "data":"xyz", "test":"one", "test":"two", "no":"numbering" }'
def find_dupes(s):
keys = re.findall(r'"(\w+)":', s)
return list(set(filter(lambda w: keys.count(w) > 1, keys)))
for key in find_dupes(s):
for i in range(1, len(re.findall(r'"{}":'.format(key), s)) + 1):
s = re.sub(r'"{}":'.format(key), r'"{}{}":'.format(key, i), s, count=1)
print(s)
打印此字符串:
{
"data1":"abc",
"data2":"xyz",
"test1":"one",
"test2":"two",
"no":"numbering"
}