从多个JSON文件向一个JSON对象追加键和值

2024-05-12 18:59:34 发布

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

我目前正在处理三个json文件。在

在master.json文件在

 {
  "master":[
    {
      "sport": "soccer",
      "id": 1
    },
    {
      "sport": "football",
      "id": 2
    }
  ]
}

数据1.json

^{pr2}$

数据2.json

{
  "soccer": {
    "stadiums": {
      "away": "StadiumA",
      "home": "StadiumB"
    }
  },
  "football": {
    "stadiums": {
      "away": "StadiumA",
      "home": "StadiumB"
    }
  }
}

我想做的是将每个json文件中每个运动的属性组合到master.json中。在

这就是我要找的:

{
  "master":[
    {
      "sport": "soccer",
      "id": 1,
      "players": 11,
      "stadiums": {
        "away": "StadiumA",
        "home": "StadiumB"
      }

    },
    {
      "sport": "football",
      "id": 2,
      "players": 12,
      "stadiums": {
        "away": "StadiumA",
        "home": "StadiumB"
      }
    }
  ]
}

理想情况下,我希望能够包含一个条件,其中data1和{}中的sport值必须匹配master.json中的值来执行追加。所以,如果“棒球”在data1data2而不是{},那么它就不包括在内了。在

我尝试过在JavaScript中使用underscore,在Python中使用json,但是没有成功。我似乎找不到一种方法来遍历这三个json文件,让它们彼此交谈,特别是看看这项运动是否匹配。在

任何帮助都将不胜感激。我也会尽力澄清和混淆。在


Tags: 文件数据masteridjsonhomeplayerssport
2条回答

这就行了。记住,这是你的案子。在

var master = {
  "master":[
    {
      "sport": "soccer",
      "id": 1
    },
    {
      "sport": "football",
      "id": 2
    }
  ]
}

var data1 = {
  "soccer": {
    "players": 11
  },
  "football": {
    "players": 12
  }
}

var data2 = {
  "soccer": {
    "stadiums": {
      "away": "StadiumA",
      "home": "StadiumB"
    }
  },
  "football": {
    "stadiums": {
      "away": "StadiumA",
      "home": "StadiumB"
    }
  }
}

var masterSports = master.master.map(function(object){
    return object.sport;
});

var data1Keep = {};
var data2Keep = {};

Object.keys(data1).map(function(key){
    if(masterSports.indexOf(key) > -1 && !data1Keep.hasOwnProperty(key)){
        data1Keep[key] = data1[key];
    }
});
Object.keys(data2).map(function(key){
    if(masterSports.indexOf(key) > -1 && !data2Keep.hasOwnProperty(key)){
        data2Keep[key] = data2[key];
    }
});

master.master.map(function(object){
    for(key in data1Keep){
        if(key == object.sport){
            for(i in data1Keep[key]){
                object[i] = data1Keep[key][i];
            }
        }
    }

    for(key2 in data2Keep){
        if(key2 == object.sport){
            for(j in data2Keep[key2]){
                object[j] = data2Keep[key2][j];
            }
        }
    }
    return object;
});

为了演示Python的相对精妙,我将给出一个解决方案:

import json
from collections import OrderedDict

with open('master.json') as m, open('data1.json') as d1, open('data2.json') as d2:
    master = json.load(m, object_pairs_hook=OrderedDict)
    data1 = json.load(d1, object_pairs_hook=OrderedDict)
    data2 = json.load(d2, object_pairs_hook=OrderedDict)

for i, obj in enumerate(master['master']):
    d1, d2 = data1.get(obj['sport']), data2.get(obj['sport'])
    if d1:
        master['master'][i].update(d1)
    if d2:
        master['master'][i].update(d2)

print(json.dumps(master,indent=2))

输出:

^{pr2}$

相关问题 更多 >