2016-07-21 23 views
0

Ich arbeite derzeit mit drei JSON-Dateien.Hängen Sie Schlüssel und Werte an ein JSON-Objekt aus mehreren JSON-Dateien an

master.json

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

data1.json

{ 
    "soccer": { 
    "players": 11 
    }, 
    "football": { 
    "players": 12 
    } 
} 

data2.json

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

Was ich möchte, ist tun Attribute in jedem json von jeder Sportart kombinieren Datei in die master.json.

Dies ist, was ich suche:

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

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

Im Idealfall würde Ich mag eine bedingte einschließen zu können, wo der Sport Wert in data1 und data2 müssen übereinstimmen, was in master.json ist das zu tun anhängend. Also, wenn "Baseball" ist in data1 und data2 aber nicht master, dann ist es nicht enthalten.

Ich habe versucht, underscore in JavaScript und json in Python, aber kein Glück. Ich kann keinen Weg finden, alle drei JSON-Dateien durchzugehen, damit sie miteinander reden, besonders um zu sehen, ob der Sport passt.

Jede Hilfe wäre zu schätzen. Ich werde auch mein Bestes tun, um Klarheit und Verwirrung zu schaffen.

+0

Ich habe versucht, die JSON-Dateien in Knoten erfordern und Durchschlinge sie in Underscore. Ich habe es auch mit Python versucht. Ich hatte keine Probleme damit, mit einem Array von Objekten zu arbeiten, aber ich bin dabei, wie ich mit dreien umgehen soll. – AldoTheApache

+0

Zeigen Sie uns Ihren Code! –

+0

Bitte zeigen Sie einen [mcve] von Ihrem letzten Versuch. – idjaw

Antwort

1

Gerade die relative Finesse von Python zu demonstrieren, werde ich in einer Lösung werfen:

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)) 

Ausgang:

{ 
    "master": [ 
    { 
     "sport": "soccer", 
     "id": 1, 
     "players": 11, 
     "stadiums": { 
     "away": "StadiumA", 
     "home": "StadiumB" 
     } 
    }, 
    { 
     "sport": "football", 
     "id": 2, 
     "players": 12, 
     "stadiums": { 
     "away": "StadiumA", 
     "home": "StadiumB" 
     } 
    } 
    ] 
} 
+0

Das hat funktioniert! Vielen Dank für Ihre Antwort! – AldoTheApache

+0

Gern geschehen. Ich habe die Antwort aktualisiert, mir ist gerade aufgefallen, dass Sie die 'dicts' nicht kopieren müssen, bevor Sie sie zum Aktualisieren des Masters verwenden. Ich war nur sehr vorsichtig. –

1

Dies wird es tun. Denken Sie daran, dies ist für Ihren Fall.

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; 
}); 
+0

Vielen Dank für Ihre Antwort! Ich ging mit der Python-Lösung, aber ich schätze Ihren JS-Beitrag. – AldoTheApache

+0

Es sieht viel einfacher und besser aus, also mache ich Ihnen keine Vorwürfe. –

Verwandte Themen