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.
- JToken = Die Mutter aller anderen Typen. Dies kann A JValue, JProperty, JArray oder JObject sein. Dies dient dazu, dem Parsing-Mechanismus einen modularen Aufbau zu verleihen.
- JValue = ein beliebiger Json-Werttyp (Zeichenfolge, Int, Boolescher Wert).
- JProperty = jeder JValue oder JContainer (siehe unten), gepaart mit einem Namen (Bezeichner) . Zum Beispiel
"name":"value".
- JContainer = Die Mutter aller Typen, die andere Typen enthalten (JObject, JValue).
- JObject = ein JContainer-Typ, der eine Sammlung von JProperties enthält
- JArray = ein JContainer-Typ, der eine Sammlung JValue oder JContainer enthält.
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 der AddAfterSelfMethode 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);
}
}
}
JObject.Parsein der letzten Zeile. Da dies auch für einfache Objekte wie String funktioniert.