在Python中联合多个嵌套json

2024-10-01 00:24:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我有多个包含关系数据的json文件需要合并,每个文件都有一个记录,其中commonkey是所有文件中的公共键,在下面的示例中a0、a1都是公共的钥匙。那个value是多个键的嵌套字典,如Key1、key2等,如下所示,我需要合并多个json文件并获得输出如图所示dboutput.json文件,文件名作为合并操作中的索引。这样的问题是一个related question,它合并了丢失的信息,但在我的例子中,我不希望任何更新来替换现有的键或跳过更新,如果碰到一个现有的键,另一个由文件名索引的嵌套字典将创建如下:

示例:

文件db1.json:


"a0": {
        "commonkey": [
            "a1", 
            "parentkeyvalue1"
        ], 
        "key1": "kvalue1", 
        "key2": "kvalue2"
        "keyp": "kvalue2abc"

    }, 
"a1": { 
...
}

文件db2.json:

^{pr2}$

期望输出

文件dboutput.json文件在

"a0": {
        "commonkey": [
            "a1", 
            "parentkeyvalue1"
        ], 
        "key1": {"db1":"kvalue1","db2":"kvalue1xyz"} ,
        "key2": {"db1":"kvalue2","db2":"kvalue2"} ,
        "key3": {"db2":"kvalue2"}
        "keyp": {"db1":"kvalue2abc"}



    }, 
"a1": { 
...
}

那么如何进行这种无损合并呢?注意“key2”:{“db1”:“kvalue2”,“db2”:“kvalue2”}即使key\value对相同,它们也需要单独存储。实际上,输出是所有输入文件的联合,并且包含所有其他文件的所有条目。在

还有

"commonkey": [
            "a1", 
            "parentkeyvalue1"
        ],

对于所有文件都是相同的,因此不需要重复


Tags: 文件json示例字典value文件名a1a0
2条回答

一个简单的解决方案是迭代每个JSON对象,并在您看到的每个“commonkey”中添加字典对。下面是一个示例,您可以在列表中加载每个JSON文件,然后迭代地合并它们。在

#!/usr/bin/python
import json

# Hardcoded list of JSON files
dbs = [ "db1.json", "db2.json" ]
output = dict() # stores all the merged output

for db in dbs:
    # Name the JSON obj and load it 
    db_name = db.split(".json")[0]
    obj = json.load(open(db))

    # Iterate through the common keys, adding them only if they're new
    for common_key, data in obj.items():
        if common_key not in output:
            output[common_key] = dict(commonkey=data["commonkey"])

        # Within each common key, add key, val pairs 
        # subindexed by the database name
        for key, val in data.items():
            if key != "commonkey":
                if key in output[common_key]:
                    output[common_key][key][db_name] = val
                else:
                    output[common_key][key] = {db_name: val}


# Output resulting json to file
open("dboutput.json", "w").write( 
    json.dumps( output, sort_keys=True, indent=4, separators=(',', ': ') )
)

我终于弄到了:

class NestedDict(collections.OrderedDict):
    """Implementation of perl's autovivification feature."""
    def __getitem__(self, item):
        try:
            return dict.__getitem__(self, item)
        except KeyError:
            value = self[item] = type(self)()
            return value

def mergejsons(jsns):
 ##use auto vification Nested Dict
    op=nesteddict.NestedDict()
    for j in jsns:
        jdata=json.load(open(j))
        jname=j.split('.')[0][-2:]
        for commnkey,val in jdata.items():
            for k,v in val.items():
                if k!='commonkey':
                    op[commnkey][k][jname]=v
                if  op[commnkey].has_key('commonkey'):
                    continue
                else:
                    op[commnkey][k][jname]=v

相关问题 更多 >