通过添加Python2.7来组合两个JSON

通过添加Python2.7来组合两个JSON,python,json,Python,Json,我想组合两个具有相同形式的JSON,并增加一个JSON中已经存在的差异数组: JSON a: JSON b: [ { "productTitle": "Product1", "api-activity": { "api1": 1 }, "totalCalls": 1 }, { "productTitle": "Product2", "api-activi

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

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
    }

]
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")
我尝试使用之前使用的脚本将它们组合起来,其中我将现有JSON与数据列表(这里是我们的第二个JSON)进行比较,如下所示:

[
    {
        "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
    }

]
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")
但我使用的不同键有一个错误:

回溯(最近一次呼叫最后一次): 文件“merge.py”,第17行,在 如果现有_数据[“api活动”]中的数据[“api活动”]: TypeError:无法损坏的类型:“dict”


你能帮我调试一下吗?我想我快成功了,或者你有更好的解决方案吗?

我会将你的计数加载到
计数器()
对象中,使用tuple
(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
    }
]

您的JSON不包含带有键
apiName
的dict,因此您当然会得到一个
KeyError:“apiName”
-您期望得到什么?好的,我编辑它,我正在寻找一种方法来添加同一个键的值它就像一个符咒!谢谢关于groupby,我不知道你对lambda做了什么,它是如何工作的?它告诉
groupby()
对产品进行分组。
api\u counts.items()
的输出形式为
(('Product1','api1'),2)
so
x[0][0]
提取
Product1