通过添加Python2.7来组合两个JSON
我想组合两个具有相同形式的JSON,并增加一个JSON中已经存在的差异数组: JSON a: JSON b:通过添加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
[
{
"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)
sox[0][0]
提取Product1