Estoy tratando de agregar un objeto JSON de un texto a un archivo JSON existente usando JSON.Net. Por ejemplo, si tengo los datos JSON de la siguiente manera:
{
"food": {
"fruit": {
"apple": {
"colour": "red",
"size": "small"
},
"orange": {
"colour": "orange",
"size": "large"
}
}
}
}
He estado intentando hacer esto así:
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);
Pero esto da el error: "Newtonsoft.Json.Linq.JProperty cannot have multiple values."
De hecho, probé algunas formas diferentes, pero parece que no puedo llegar a ninguna parte. En mi ejemplo, lo que realmente quiero hacer es agregar el nuevo elemento a "fruta". Por favor, avíseme si hay una mejor manera de hacer esto o una biblioteca más simple de usar.

JObject.Parse, en la última línea. Como esto también funciona para objetos simples como cuerdas.JPropertypor uno diferente, entonces puedes usar elReplacemétodo. Si solo desea cambiar el valor deJProperty, puede establecer laValuepropiedad en él; se puede escribir. Consulte la referencia de la API de LINQ-to-JSON .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.
"name":"value".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 esteAddAfterSelfmé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); } } }fuente
JToken(noJValue) es la clase base de la queJArray,JObject,JPropertyyJValueen última instancia Heredar.JValuees una primitiva JSON que representa una cadena, número, booleano, fecha o valor nulo; no puede representar una matriz u objeto. Consulte la Referencia de la API de LINQ-to-JSON .Simplemente agregando
.Firsta subananaTokendebería hacerlo: básicamente se mueve más allá del para convertirlo en un en lugar de un .foodJsonObj["food"]["fruit"]["orange"].Parent.AddAfterSelf(bananaToken.First);.First{JPropertyJToken@Brian Rogers, Gracias, olvidé el
.Parent. Editadofuente