Ich versuche, mit JSON.Net ein JSON-Objekt aus einem Text zu einer vorhandenen JSON-Datei hinzuzufügen. Zum Beispiel, wenn ich die folgenden JSON-Daten habe:
{
"food": {
"fruit": {
"apple": {
"colour": "red",
"size": "small"
},
"orange": {
"colour": "orange",
"size": "large"
}
}
}
}
Ich habe versucht, dies so zu machen:
var foodJsonObj = JObject.Parse(jsonText);
var bananaJson = JObject.Parse(@"{ ""banana"" : { ""colour"": ""yellow"", ""size"": ""medium""}}");
var bananaToken = bananaJson as JToken;
foodJsonObj["food"]["fruit"]["orange"].AddAfterSelf(bananaToken);
Aber das gibt den Fehler: "Newtonsoft.Json.Linq.JProperty cannot have multiple values."
Ich habe tatsächlich ein paar verschiedene Wege ausprobiert, komme aber anscheinend nicht weiter. In meinem Beispiel möchte ich den neuen Artikel wirklich zu "Obst" hinzufügen. Bitte lassen Sie mich wissen, ob es einen besseren Weg gibt, dies zu tun, oder ob eine einfachere Bibliothek zu verwenden ist.
JObject.Parse
in der letzten Zeile. Da dies auch für einfache Objekte wie String funktioniert.JProperty
ein anderes ersetzen möchten , können Sie dieReplace
Methode verwenden. Wenn Sie nur den Wert von ändern möchtenJProperty
, können Sie dieValue
Eigenschaft darauf festlegen . es ist beschreibbar. Siehe die LINQ-to-JSON-API-Referenz .TL; DR: Sie sollten einem JObject eine JProperty hinzufügen. Einfach. Die Indexabfrage gibt einen JValue zurück. Finden Sie also heraus, wie Sie stattdessen die JProperty erhalten können :)
Die akzeptierte Antwort beantwortet die Frage anscheinend nicht. Was ist, wenn ich eine JProperty nach einer bestimmten hinzufügen möchte? Beginnen wir zunächst mit Terminologien, die mir wirklich den Kopf verdreht haben.
"name":"value"
.Wenn Sie jetzt ein Json-Element mit dem Index [] abfragen, erhalten Sie das JToken ohne den Bezeichner, bei dem es sich möglicherweise um einen JContainer oder einen JValue handelt (erfordert Casting), aber Sie können danach nichts hinzufügen, da es sich nur um einen Wert handelt. Sie können es selbst ändern, tiefere Werte abfragen, aber Sie können beispielsweise nichts danach hinzufügen.
Was Sie tatsächlich erhalten möchten, ist die Eigenschaft als Ganzes, und fügen Sie danach nach Wunsch eine weitere Eigenschaft hinzu. Dazu verwenden Sie
JOjbect.Property("name")
eine weitere JProperty Ihres Wunsches, erstellen diese und fügen sie anschließend mit derAddAfterSelf
Methode hinzu. Sie sind dann fertig.Für weitere Informationen: http://www.newtonsoft.com/json/help/html/ModifyJson.htm
Dies ist der Code, den ich geändert habe.
public class Program { public static void Main() { try { string jsonText = @" { ""food"": { ""fruit"": { ""apple"": { ""colour"": ""red"", ""size"": ""small"" }, ""orange"": { ""colour"": ""orange"", ""size"": ""large"" } } } }"; var foodJsonObj = JObject.Parse(jsonText); var bananaJson = JObject.Parse(@"{ ""banana"" : { ""colour"": ""yellow"", ""size"": ""medium""}}"); var fruitJObject = foodJsonObj["food"]["fruit"] as JObject; fruitJObject.Property("orange").AddAfterSelf(new JProperty("banana", fruitJObject)); Console.WriteLine(foodJsonObj.ToString()); } catch (Exception ex) { Console.WriteLine(ex.GetType().Name + ": " + ex.Message); } } }
quelle
JToken
(nichtJValue
) ist die Basisklasse , von derJArray
,JObject
,JProperty
undJValue
schließlich erbt.JValue
ist ein JSON-Grundelement, das eine Zeichenfolge, eine Zahl, einen Booleschen Wert, ein Datum oder einen Nullwert darstellt. Es kann kein Array oder Objekt darstellen. Siehe die LINQ-zu-JSON-API-Referenz .Nur das Hinzufügen
.First
zu IhrembananaToken
sollte es tun: bewegt sich im Grunde an dem vorbei , um es zu einem statt zu einem zu machen .foodJsonObj["food"]["fruit"]["orange"].Parent.AddAfterSelf(bananaToken
.First
);
.First
{
JProperty
JToken
@ Brian Rogers, danke ich habe das vergessen
.Parent
. Bearbeitetquelle