2016-07-29 12 views
1

Ich habe mit einigen Problemen zu tun, die meine Json-Arrays zusammenführen. Die Original-Arrays zusammengefasst werden ähnlich aussehen wie diese:C# JObject verschachtelt nicht richtig

{ 
    "ads":[ 
    { 
     "a1": "b1", 
     "i1": "j1", 
     "x1": "y1", 
    } 
    ] 
} 

{ 
    "ads": [ 
    { 
     "a2": "b2", 
     "i2": "j2", 
     "x2": "y2", 
    } 
    ] 
} 

Das Ergebnis meiner merge sieht wie folgt aus:

{ 
    "ads:[ 
    [ 
     { 
     "a1": "b1", 
     "i1": "j1", 
     "x1": "y1", 
     } 
    ], 
    [ 
     { 
     "a2": "b2", 
     "i2": "j2", 
     "x2": "y2", 
     } 
    ] 
    ] 
} 

Was ich versuche, dies zu abspecken, ist:

{ 
    "ads:[ 
    { 
     "a1": "b1", 
     "i1": "j1", 
     "x1": "y1", 
    }, 
    { 
     "a2": "b2", 
     "i2": "j2", 
     "x2": "y2", 
    } 
    ] 
} 

Der Code, der den beiden ist, zur Zeit, dies zu versuchen, die verwendet wird, zu fusionieren:

 // Combine all ads within formattedContent into one single JOBject. 
     JToken token = null; 
     JArray jarray = new JArray(); 
     List<JToken> jtokens = new List<JToken>(); 
     foreach (JObject jobject in formattedContent) 
     { 
      token = JToken.Parse(jobject.SelectToken("ads").ToString());     
      jarray.Add(token); 
     } 

Aber ich bin mit den doppelt verschachtelten Arrays stecken, wenn das Endprodukt in allen Anzeigen im "Anzeigen" -Token unter einem Array resultieren muss. Beachten Sie, dass formatedContent in dem obigen Code ein List<JObject> ist. Jede Hilfe beim Zusammenführen von JSON-Arrays wäre erwünscht. Wenn versucht wird, die Token zu einer Zeichenfolge hinzuzufügen, bevor sie zum JArray hinzugefügt werden, werden Wagenrücklaufzeichen und Escape-Zeichen hinzugefügt. (Diese werden nur während der Debugger-Ansicht hinzugefügt [wie ich es häufig vorgeschlagen habe], sie sind jedoch tatsächlich) reflektiert im Endprodukt)

+0

Haben Sie die Kontrolle über die JSON-Formate, oder müssen Sie mit dem JSON arbeiten, den Sie oben zeigen? – Jonathan

+0

Der Kommentar von @dbc ist die Syntax, nach der ich gesucht habe. Um Ihre Frage zu beantworten, nein, ich bin gezwungen, in dieses Json-Format durch eine externe API, die mich zwingt, alle 6000 Anzeigen (bei 300 pro Seite) zusammenzuführen, nur weil sie keine Suche nach Händler-Funktion haben. –

Antwort

0

Was möchten Sie tun, ist token.Children() hinzuzufügen, anstatt token zu jarray (dh fügen Sie den Inhalt der token statt token selbst):

var jarray = new JArray(); 
foreach (var jobject in formattedContent) 
{ 
    var token = jobject.SelectToken("ads") as JArray; 
    if (token != null) 
     jarray.Add(token.Children()); 
} 

Übrigens könnten Sie erreichen die gleicher Effekt mit JContainer.Merge() auf dem Root-Objekt, mit der Einstellung JsonMergeSettings.MergeArrayHandling = MergeArrayHandling.Concat:

var merged = new JObject(); 
var settings = new JsonMergeSettings 
{ 
    MergeArrayHandling = MergeArrayHandling.Concat, 
}; 
foreach (var jobject in formattedContent) 
{ 
    merged.Merge(jobject, settings); 
}