es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Por qué reemplazar un JToken no actualiza el propio token?

Si selecciono un JToken de un JObject, cuando reemplazo ese JToken ¿por qué no se actualiza aunque el JObject sí lo haga?

Toma este código como ejemplo:
“`C#
using Newtonsoft.Json.Linq;
using System;

namespace TestingSolution
{
public static class Program
{
private const string TestJson =
@"{
""name"": ""Test Json"",
""values"": {
""SomeValue"": ""12345""
}
}";
public static void Main()
{
JObject parsedJson = JObject.Parse(TestJson);
JToken values = parsedJson.SelectToken("values");

<pre><code> values.Replace(JToken.Parse(@"{""SomeValue2"": ""98765""}"));

Console.WriteLine("===== parsedJson =====");
Console.WriteLine(parsedJson.ToString());

Console.WriteLine("\n======= values =======");
Console.WriteLine(values.ToString());

Console.ReadLine();
}
}
</code></pre>

}

<pre><code><br />Cuando se ejecuta, mostrará lo siguiente:
</code></pre>

===== parsedJson =====
{
"name": "Test Json",
"values": {
"SomeValue2": "98765"
}
}

======= values =======
{
"SomeValue": "12345"
}
“`

¿Por qué el objeto values contiene los datos antiguos?

Usando Newtonsoft.Json versión 13.0.1

Tags:  ,

Answer

  1. Avatar for davy.ai

    La razón por la cual el objeto ‘values’ todavía tiene los datos antiguos es porque el método ‘Replace’ de la clase ‘JToken’ opera en la instancia actual del objeto y devuelve el objeto que fue reemplazado. Por lo tanto, cuando se llama a ‘values.Replace()’, devuelve el valor antiguo, que luego se descarta. Esto significa que el nuevo valor se establece correctamente en el objeto ‘parsedJson’, pero no en el objeto ‘values’.

    Para actualizar el objeto ‘values’ con los nuevos datos, se debe llamar nuevamente al método ‘SelectToken’ de la clase ‘JObject’, de la siguiente manera:

    values = parsedJson.SelectToken("values");
    

    Esto asignará nuevamente la variable ‘values’ al token actualizado en el objeto ‘parsedJson’, que contendrá los nuevos datos.

    Entonces, el código actualizado sería:

    “`C#
    using Newtonsoft.Json.Linq;
    using System;

    namespace TestingSolution
    {
    public static class Program
    {
    private const string TestJson =
    @”{
    “”name””: “”Test Json””,
    “”values””: {
    “”SomeValue””: “”12345″”
    }
    }”;
    public static void Main()
    {
    JObject parsedJson = JObject.Parse(TestJson);
    JToken values = parsedJson.SelectToken(“values”);

            values.Replace(JToken.Parse(@"{""SomeValue2"": ""98765""}"));
            values = parsedJson.SelectToken("values");
    
            Console.WriteLine("===== parsedJson =====");
            Console.WriteLine(parsedJson.ToString());
    
            Console.WriteLine("\n======= values =======");
            Console.WriteLine(values.ToString());
    
            Console.ReadLine();
        }
    }
    

    }


    Esto imprimirá lo siguiente:

    ===== parsedJson =====
    {
    “name”: “Test Json”,
    “values”: {
    “SomeValue2”: “98765”
    }
    }

    ======= values =======
    {
    “SomeValue2”: “98765”
    }
    “`

Comments are closed.