通过添加python2.7组合两个JSON

2024-05-18 10:17:02 发布

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

我想合并两个具有相同形式的JSON,并增加已经存在于一个JSON中的differents数组: JSON a:

[
    {
        "productTitle": "Product1",
        "api-activity": {
            "api1": 1
        },
        "totalCalls": 1
    },
    {
        "productTitle": "Product2",
        "api-activity": {
            "api1": 1,
            "api2": 2,
            "api3": 3,
            "api4": 4
        },
        "totalCalls": 10
    }

]

JSON b:

[
    {
        "productTitle": "Product1",
        "api-activity": {
            "api1": 1
        },
        "totalCalls": 1
    },
    {
        "productTitle": "Product2",
        "api-activity": {
            "api1": 1,
            "api2": 2,
            "api3": 3,
            "api4": 4
        },
        "totalCalls": 10
    },
    {
        "productTitle": "Product3",
        "api-activity": {
            "api1": 2
        },
        "totalCalls": 2
    }

]

要得到这样的东西:

[
    {
        "productTitle": "Product1",
        "api-activity": {
            "api1": 2
        },
        "totalCalls": 2
    },
    {
        "productTitle": "Product2",
        "api-activity": {
            "api1": 2,
            "api2": 4,
            "api3": 6,
            "api4": 8
        },
        "totalCalls": 20
    },
    {
        "productTitle": "Product3",
        "api-activity": {
            "api1": 2
        },
        "totalCalls": 2
    }

]

我尝试使用前面的脚本将它们组合起来,我将现有的JSON与数据列表(这里是我们的第二个JSON)进行比较,如下所示:

import json

with open('testa.json') as json_data:
    json_a = json.load(json_data)

with open('testb.json') as json_data:
    json_b = json.load(json_data)

with open('outputMerge.json', 'w') as f:

    data_list = json_a
    for data in json_b:
        title = data["productTitle"] #get all product title
        exist = False

        for existing_data in data_list: #loop in data_list
            if data["api-activity"] in existing_data["api-activity"]:
                print ("true")

但是我使用的不同的键有一个错误:

回溯(最近一次呼叫): “文件”合并.py“,第17行,in 如果现有数据[“api活动”]中的数据[“api活动”]: TypeError:无法处理的类型:“dict”

你能帮我调试一下吗?我觉得我很接近了,或者你有更好的解决方案吗?你知道吗


Tags: 数据inapijsondataactivityapi2api3
1条回答
网友
1楼 · 发布于 2024-05-18 10:17:02

我将通过将计数加载到Counter()对象中,使用元组(title, api)作为键来实现这一点。然后可以将其转换回输出字典,例如:

Counter({('Product2', 'api4'): 8, ('Product2', 'api3'): 6, ('Product2', 'api2'): 4, ('Product1', 'api1'): 2, ('Product2', 'api1'): 2, ('Product3', 'api1'): 2})

可按以下步骤进行:

from collections import Counter            
from itertools import groupby
import json

api_counts = Counter()

def update_counters(json_filename):
    with open(json_filename) as f_json:
        for product in json.load(f_json):
            title = product['productTitle']
            api_counts.update({(title, api) : count for api, count in product['api-activity'].items()})

update_counters('testa.json')
update_counters('testb.json')

output = []

for product, apis in groupby(sorted(api_counts.items()), lambda x: x[0][0]):
    api_activity = {}
    total_calls = 0

    for (p, api), count in apis:
        api_activity[api] = count
        total_calls += count

    output.append({'productTitle': product, 'api-activity' : api_activity, 'totalCalls' : total_calls})

with open('outputMerge.json', 'w') as f_output:
    json.dump(output, f_output, indent=4)

提供以下输出:

[
    {
        "productTitle": "Product1",
        "api-activity": {
            "api1": 2
        },
        "totalCalls": 2
    },
    {
        "productTitle": "Product2",
        "api-activity": {
            "api1": 2,
            "api2": 4,
            "api3": 6,
            "api4": 8
        },
        "totalCalls": 20
    },
    {
        "productTitle": "Product3",
        "api-activity": {
            "api1": 2
        },
        "totalCalls": 2
    }
]

相关问题 更多 >