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.JProperty
por uno diferente, entonces puedes usar elReplace
método. Si solo desea cambiar el valor deJProperty
, puede establecer laValue
propiedad 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 esteAddAfterSelf
mé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
,JProperty
yJValue
en última instancia Heredar.JValue
es 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
.First
a subananaToken
deberí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
{
JProperty
JToken
@Brian Rogers, Gracias, olvidé el
.Parent
. Editadofuente