Próbuję dodać obiekt JSON z jakiegoś tekstu do istniejącego pliku JSON przy użyciu JSON.Net. Na przykład, jeśli mam dane JSON jak poniżej:
{
"food": {
"fruit": {
"apple": {
"colour": "red",
"size": "small"
},
"orange": {
"colour": "orange",
"size": "large"
}
}
}
}
Próbowałem to zrobić w ten sposób:
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);
Ale to daje błąd: "Newtonsoft.Json.Linq.JProperty cannot have multiple values."
Właściwie wypróbowałem kilka różnych sposobów, ale nie wydaje mi się, żebym to osiągnął. W moim przykładzie to, co naprawdę chciałbym zrobić, to dodać nowy element do „owoców”. Daj mi znać, jeśli istnieje lepszy sposób na zrobienie tego lub prostsza biblioteka.
JObject.Parse
w ostatnim wierszu. Ponieważ działa to również w przypadku prostych obiektów, takich jak string.JProperty
innego, możesz użyć tejReplace
metody. Jeśli chcesz tylko zmienić wartość elementuJProperty
, możesz ustawić na nimValue
właściwość; jest zapisywalny. Zobacz dokumentację interfejsu API LINQ-to-JSON .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ę.
"name":"value"
.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 tejAddAfterSelf
metodzie. 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); } } }
źródło
JToken
(nieJValue
) jest klasą bazową, z którejJArray
,JObject
,JProperty
iJValue
ostatecznie dziedziczy.JValue
jest prymitywem JSON, który reprezentuje ciąg, liczbę, wartość logiczną, datę lub wartość null; nie może reprezentować tablicy ani obiektu. Zobacz dokumentację interfejsu API LINQ-to-JSON .Po prostu dodanie
.First
do swojegobananaToken
powinno to zrobić: w zasadzie przesuwa się poza, aby zrobić to zamiast a .foodJsonObj["food"]["fruit"]["orange"].Parent.AddAfterSelf(bananaToken
.First
);
.First
{
JProperty
JToken
@Brian Rogers, Dzięki, zapomniałem
.Parent
. Edytowanoźródło