TL; DR: Debe agregar una JProperty a un JObject. Sencillo. La consulta de índice devuelve un JValue, así que averigüe cómo obtener JProperty en su lugar :)
La respuesta aceptada no responde a la pregunta como parece. ¿Qué sucede si quiero agregar específicamente una JProperty después de una específica? Primero, comencemos con terminologías que realmente me hicieron pensar.
- JToken = La madre de todos los demás tipos. Puede ser A JValue, JProperty, JArray o JObject. Esto es para proporcionar un diseño modular al mecanismo de análisis.
- JValue = cualquier tipo de valor Json (cadena, int, booleano).
- JProperty = cualquier JValue o JContainer (ver más abajo) emparejado con un nombre (identificador) . Por ejemplo
"name":"value".
- JContainer = La madre de todos los tipos que contienen otros tipos (JObject, JValue).
- JObject = un tipo JContainer que contiene una colección de JProperties
- JArray = un tipo JContainer que contiene una colección JValue o JContainer.
Ahora, cuando consulta el elemento Json usando el índice [], obtiene el JToken sin el identificador, que podría ser un JContainer o un JValue (requiere conversión), pero no puede agregar nada después, porque es solo un valor. Puede cambiarlo por sí mismo, consultar valores más profundos, pero no puede agregar nada después, por ejemplo.
Lo que realmente desea obtener es la propiedad en su conjunto y luego agregar otra propiedad después de ella como desee. Para esto, use JOjbect.Property("name"), y luego cree otra JProperty de su deseo y luego agréguela después de este AddAfterSelfmétodo de uso . Entonces ha terminado.
Para obtener más información: http://www.newtonsoft.com/json/help/html/ModifyJson.htm
Este es el código que modifiqué.
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, en la última línea. Como esto también funciona para objetos simples como cuerdas.