重命名json文件python中的重复键

时间:2017-07-11 07:05:20

标签: python json

我有json文件,它有重复的键。

实施例

{
  "data":"abc",
  "data":"xyz"
}

我想这样做     {       “DATA1”: “ABC”,       “DATA2”: “XYZ”     }

我尝试将object_pairs_hook与json_loads一起使用,但它无效。任何人都可以帮我解决上述问题的Python解决方案

2 个答案:

答案 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"
}