TL; DR: dovresti aggiungere una JProperty a un JObject. Semplice. La query dell'indice restituisce un JValue, quindi scopri come ottenere invece JProperty :)
La risposta accettata non è rispondere alla domanda come sembra. E se volessi aggiungere in modo specifico una JProperty dopo una specifica? Innanzitutto, iniziamo con le terminologie che mi hanno davvero fatto girare la testa.
- JToken = La madre di tutti gli altri tipi. Può essere A JValue, JProperty, JArray o JObject. Questo per fornire un design modulare al meccanismo di analisi.
- JValue = qualsiasi tipo di valore Json (stringa, int, booleano).
- JProperty = qualsiasi JValue o JContainer (vedi sotto) abbinato a un nome (identificatore) . Ad esempio
"name":"value"
.
- JContainer = La madre di tutti i tipi che contengono altri tipi (JObject, JValue).
- JObject = un tipo JContainer che contiene una raccolta di JProperties
- JArray = un tipo JContainer che contiene una raccolta JValue o JContainer.
Ora, quando si interroga l'elemento Json utilizzando l'indice [], si ottiene il JToken senza l'identificatore, che potrebbe essere un JContainer o un JValue (richiede il casting), ma non è possibile aggiungere nulla dopo di esso, perché è solo un valore. Puoi modificarlo da solo, interrogare valori più profondi, ma non puoi aggiungere nulla dopo di esso, ad esempio.
Ciò che si desidera effettivamente ottenere è la proprietà nel suo insieme, quindi aggiungere un'altra proprietà dopo di essa come desiderato. Per questo, usi JOjbect.Property("name")
e quindi crei un'altra JProperty di tuo desiderio e poi aggiungila dopo questo utilizzoAddAfterSelf
metodo . Allora hai finito.
Per maggiori informazioni: http://www.newtonsoft.com/json/help/html/ModifyJson.htm
Questo è il codice che ho modificato.
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.Parse
, sull'ultima riga. Poiché funziona anche per oggetti semplici come string.