加入JSON属性

时间:2017-04-27 15:42:03

标签: javascript json

我正在使用javascript,我想将两个JSON文件加入到包含所有属性的单个JSON对象中。现在两个JSON文件有单独的信息,但我需要将它们组合起来。

Station Information JSON - 以下示例:

{  
   "last_updated":1493307962,
   "ttl":10,
   "data":{  
      "stations":[  
         {  
            "station_id":"219",
            "name":"Central Square - East Boston",
            "short_name":"A32036",
            "lat":42.37454454514976,
            "lon":-71.03837549686432,
            "region_id":10,
            "rental_methods":[  
               "KEY",
               "CREDITCARD"
            ],
            "capacity":19,
            "eightd_has_key_dispenser":false
         },
         {  
            "station_id":"220",
            "name":"Test 1",
            "short_name":"Test 1",
            "lat":0,
            "lon":0,
            "rental_methods":[  
               "KEY",
               "CREDITCARD"
            ],
            "capacity":0,
            "eightd_has_key_dispenser":false
         }
      ]
   }
} 

Station Status JSON - 以下示例:

{  
   "last_updated":1493308075,
   "ttl":10,
   "data":{  
      "stations":[
         {  
            "station_id":"219",
            "num_bikes_available":7,
            "num_bikes_disabled":1,
            "num_docks_available":11,
            "num_docks_disabled":0,
            "is_installed":1,
            "is_renting":1,
            "is_returning":1,
            "last_reported":1493283725,
            "eightd_has_available_keys":false
         },
         {  
            "station_id":"220",
            "num_bikes_available":0,
            "num_bikes_disabled":0,
            "num_docks_available":0,
            "num_docks_disabled":0,
            "is_installed":0,
            "is_renting":0,
            "is_returning":0,
            "last_reported":0,
            "eightd_has_available_keys":false
         }
      ]
   }
}

具体来说,我查看了这篇文章(How to join two json object in javascript, without using JQUERY),但是这两个JSON文件的结构更复杂,所以我无法使它工作。

任何建议都会非常感激。

3 个答案:

答案 0 :(得分:0)

我认为你对周围的参数不感兴趣。您可以使用此代码获取包含基于station_id的所有信息的工作站数组

obj1.data.stations.map(el1 => Object.assign({},el1,obj2.data.stations.filter(el2 => el2.station_id === el1.station_id)));

obj1obj2是您的JSON。

"[
  {
    "0": {
      "station_id": "219",
      "num_bikes_available": 7,
      "num_bikes_disabled": 1,
      "num_docks_available": 11,
      "num_docks_disabled": 0,
      "is_installed": 1,
      "is_renting": 1,
      "is_returning": 1,
      "last_reported": 1493283725,
      "eightd_has_available_keys": false
    },
    "station_id": "219",
    "name": "Central Square - East Boston",
    "short_name": "A32036",
    "lat": 42.37454454514976,
    "lon": -71.03837549686432,
    "region_id": 10,
    "rental_methods": [
      "KEY",
      "CREDITCARD"
    ],
    "capacity": 19,
    "eightd_has_key_dispenser": false
  },
  {
    "0": {
      "station_id": "220",
      "num_bikes_available": 0,
      "num_bikes_disabled": 0,
      "num_docks_available": 0,
      "num_docks_disabled": 0,
      "is_installed": 0,
      "is_renting": 0,
      "is_returning": 0,
      "last_reported": 0,
      "eightd_has_available_keys": false
    },
    "station_id": "220",
    "name": "Test 1",
    "short_name": "Test 1",
    "lat": 0,
    "lon": 0,
    "rental_methods": [
      "KEY",
      "CREDITCARD"
    ],
    "capacity": 0,
    "eightd_has_key_dispenser": false
  }
]"

答案 1 :(得分:0)

我猜你想合并电台。如果两个工作站阵列的顺序相同(如示例所示),则可以通过以下方式轻松完成:

首先使用JSON.parse解析两个JSON,然后使用Object.assign合并每个工作站对象

var obj1 = JSON.parse('your-first-json');
var obj2 = JSON.parse('your-second-json');

obj1.data.stations.forEach(function(item, i) {
    Object.assign(item, obj2.data.stations[i])
});
//obj1 will have the obj2 sation data.

如果数组的顺序不同(相同的索引 - 相同的ID),则必须在执行合并之前按ID执行查找。

您可以使用Array.find

obj1.data.stations.forEach(function(station, i){

    var station2 = obj2.data.stations.find(function(item) {
        return item.station_id === station.station_id;
    });

    Object.assign(station, station2);
});

我不知道你在哪里运行它,如果在节点或浏览器中,但有Object.assign和&的聚合填充。我提供的链接中Array.find。此外,还有许多使用jQuery或其他类似库的类似函数。

var obj1 = {
   "last_updated":1493307962,
   "ttl":10,
   "data":{
      "stations":[
         {
            "station_id":"219",
            "name":"Central Square - East Boston",
            "short_name":"A32036",
            "lat":42.37454454514976,
            "lon":-71.03837549686432,
            "region_id":10,
            "rental_methods":[
               "KEY",
               "CREDITCARD"
            ],
            "capacity":19,
            "eightd_has_key_dispenser":false
         },
         {
            "station_id":"220",
            "name":"Test 1",
            "short_name":"Test 1",
            "lat":0,
            "lon":0,
            "rental_methods":[
               "KEY",
               "CREDITCARD"
            ],
            "capacity":0,
            "eightd_has_key_dispenser":false
         }
      ]
   }
};

var obj2 = {
   "last_updated":1493308075,
   "ttl":10,
   "data":{
      "stations":[
         {
            "station_id":"219",
            "num_bikes_available":7,
            "num_bikes_disabled":1,
            "num_docks_available":11,
            "num_docks_disabled":0,
            "is_installed":1,
            "is_renting":1,
            "is_returning":1,
            "last_reported":1493283725,
            "eightd_has_available_keys":false
         },
         {
            "station_id":"220",
            "num_bikes_available":0,
            "num_bikes_disabled":0,
            "num_docks_available":0,
            "num_docks_disabled":0,
            "is_installed":0,
            "is_renting":0,
            "is_returning":0,
            "last_reported":0,
            "eightd_has_available_keys":false
         }
      ]
   }
};


obj1.data.stations.forEach(function(item, i) {
	Object.assign(item, obj2.data.stations[i])
});

console.log(obj1)

答案 2 :(得分:0)

此代码的行为类似于第二个对象上的连接(但可以扩展为执行完全外部连接)

它通过将字符串_conflict附加到键名

来处理冲突

我已经写了这篇文章来帮助您入门,但您必须对其进行自定义以支持您的确切结构

组合对象不再是一个列表,但与数组具有相同的索引。



var obj1 = {  
   "conflicting_key":1493307962,
   "concurrent_key":10,
   "data":{  
      "listOfEvents":[ 
         {  
            "event_id":219,
            "name":"Central Square - East Boston",
            "rental_methods":[  
               "KEY",
               "CREDITCARD"
            ],
            "capacity":19
         },
         {  
            "event_id":220,
            "name":"Test 1",
            "lat":0,
            "lon":0,
            "rental_methods":[  
               "KEY",
               "CREDITCARD"
            ],
            "capacity":0,
            "eightd_has_key_dispenser":false
         }
      ]
   }
};

var obj2 = {  
   "conflicting_key":1493308075,
   "concurrent_key":10,
   "data":{  
      "listOfEvents":[
         {  
            "event_id":219,
            "num_bikes_available":7,
            "num_bikes_disabled":1,
            "last_reported":1493283725,
            "eightd_has_available_keys":false
         },
         {  
            "event_id":220,
            "num_bikes_available":0,
            "num_bikes_disabled":0,
            "num_docks_available":0,
            "is_returning":0,
            "last_reported":0,
            "eightd_has_available_keys":false
         }
      ]
   }
};

function combine(obj1, obj2) {
  var combinedObject = Object.assign({}, obj1);
  for(var key in obj2) {
    if(typeof obj2[key] !== "object") {
      if(obj1[key] !== obj2[key]) {
        var keyName = key;
        if(key in obj1) {
          keyName = keyName + "_conflict";
        }
        combinedObject[keyName] = obj2[key];
      }
    } else {
      combinedObject[key] = combine(obj1[key], obj2[key]);
    }
  }
  return combinedObject;
}

console.log(combine(obj1, obj2));