Saltar al contenido

Acceder a todos los elementos en el JToken

Bienvenido a nuestra comunidad, en este lugar encontrarás la respuesta que andabas buscando.

Solución:

Puedes lanzar tu JToken a un JObject y luego usa el Properties() método para obtener una lista de las propiedades del objeto. A partir de ahí, puede obtener los nombres con bastante facilidad.

Algo como esto:

string json =
@"
    ""ADDRESS_MAP"":

        ""ADDRESS_LOCATION"":
            ""type"":""separator"",
            ""name"":""Address"",
            ""value"":"""",
            ""FieldID"":40
        ,
        ""LOCATION"":
            ""type"":""locations"",
            ""name"":""Location"",
            ""keyword"":
                ""1"":""LOCATION1""
            ,
            ""value"":
                ""1"":""United States""
            ,
            ""FieldID"":41
        ,
        ""FLOOR_NUMBER"":
            ""type"":""number"",
            ""name"":""Floor Number"",
            ""value"":""0"",
            ""FieldID"":55
        ,
        ""self"":
            ""id"":""2"",
            ""name"":""Address Map""
        
    
";

JToken outer = JToken.Parse(json);
JObject inner = outer["ADDRESS_MAP"].Value();

List keys = inner.Properties().Select(p => p.Name).ToList();

foreach (string k in keys)

    Console.WriteLine(k);

Producción:

ADDRESS_LOCATION
LOCATION
FLOOR_NUMBER
self

Además de la respuesta aceptada, me gustaría dar una respuesta que muestre cómo iterar directamente sobre las colecciones de Newtonsoft. Utiliza menos código y supongo que es más eficiente ya que no implica convertir las colecciones.

using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
//Parse the data
JObject my_obj = JsonConvert.DeserializeObject(your_json);

foreach (KeyValuePair sub_obj in (JObject)my_obj["ADDRESS_MAP"])

    Console.WriteLine(sub_obj.Key);

Empecé a hacer esto yo mismo porque JsonConvert deserializa automáticamente los objetos anidados como JToken (que son JObject, JValue o JArray debajo, creo).

Creo que el análisis funciona de acuerdo con los siguientes principios:

  • Cada objeto se abstrae como un JToken

  • Enviar a JObject donde espera un Diccionario

  • Transmitir a JValue si el JToken representa un nodo terminal y es un valor

  • Transmitir a JArray si es un array

  • JValue.Value le brinda el tipo de .NET que necesita

Si conoce la estructura del json que está recibiendo, le sugiero que tenga una estructura de clase que refleje lo que está recibiendo en json.

Entonces puedes llamarlo algo como esto…

AddressMap addressMap = JsonConvert.DeserializeObject(json);

(Donde json es un string que contiene el json en cuestión)

Si no conoce el formato del json que está recibiendo, entonces se vuelve un poco más complicado y probablemente necesite analizarlo manualmente.

consulte http://www.hanselman.com/blog/NuGetPackageOfTheWeek4DeserializingJSONWithJsonNET.aspx para obtener más información

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *