TL; DR: Powinieneś dodać JProperty do JObject. Prosty. Zapytanie indeksujące zwraca JValue, więc dowiedz się, jak zamiast tego uzyskać JProperty :)
Przyjęta odpowiedź nie odpowiada na pytanie, jak się wydaje. A jeśli chcę konkretnie dodać JProperty po konkretnym? Po pierwsze, zacznijmy od terminologii, która naprawdę przykuła moją głowę.
- JToken = matka wszystkich innych typów. Może to być JValue, JProperty, JArray lub JObject. Ma to na celu zapewnienie modułowej konstrukcji mechanizmu analizowania.
- JValue = dowolny typ wartości Json (string, int, boolean).
- JProperty = dowolna JValue lub JContainer (patrz poniżej) w połączeniu z nazwą (identyfikatorem) . Na przykład
"name":"value".
- JContainer = Matka wszystkich typów, które zawierają inne typy (JObject, JValue).
- JObject = typ JContainer, który zawiera kolekcję JProperties
- JArray = typ JContainer, który zawiera kolekcję JValue lub JContainer.
Teraz, gdy odpytujesz element Json za pomocą indeksu [], otrzymujesz JToken bez identyfikatora, którym może być JContainer lub JValue (wymaga rzutowania), ale nie możesz nic dodać po nim, ponieważ jest to tylko wartość. Możesz go zmienić samodzielnie, zapytać o głębsze wartości, ale nie możesz na przykład nic dodać po nim.
W rzeczywistości chcesz uzyskać właściwość jako całość, a następnie dodaj kolejną właściwość po niej zgodnie z potrzebami. W tym celu używasz JOjbect.Property("name"), a następnie tworzysz kolejną JProperty według własnego uznania, a następnie dodajesz ją po tej AddAfterSelfmetodzie. Jesteś skończony.
Więcej informacji: http://www.newtonsoft.com/json/help/html/ModifyJson.htm
To jest kod, który zmodyfikowałem.
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.Parsew ostatnim wierszu. Ponieważ działa to również w przypadku prostych obiektów, takich jak string.