Saltar al contenido

Deserializar la cadena JSON en el diccionario

Solución:

Vea la respuesta de mridula para saber por qué obtiene nulo. Pero si desea convertir directamente la cadena json en un diccionario, puede intentar seguir el fragmento de código.

    Dictionary<string, object> values = 
JsonConvert.DeserializeObject<Dictionary<string, object>>(json);

Me gusta este método:

using Newtonsoft.Json.Linq;
//jsonString is your JSON-formatted string
JObject jsonObj = JObject.Parse(jsonString);
Dictionary<string, string> dictObj = jsonObj.ToObject<Dictionary<string, object>>();

Ahora puede acceder a todo lo que desee utilizando el dictObj como diccionario. También puedes usar Dictionary<string, string> si prefiere obtener los valores como cadenas.

La documentación de MSDN para as la palabra clave indica que la declaración expression as type es equivalente a la declaración expression is type ? (type)expression : (type)null. Si tu corres json.GetType() volverá System.Object[] y no System.Collections.Generic.Dictionary.

En casos como estos, donde el tipo de objeto en el que quiero deserializar un objeto json es complejo, uso una API como Json.NET. Puede escribir su propio deserializador como:

class DictionaryConverter : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        Throw(new NotImplementedException());            
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        // Your code to deserialize the json into a dictionary object.

    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        Throw(new NotImplementedException());   
    }
}

Y luego puede usar este serializador para leer el json en su objeto de diccionario. He aquí un ejemplo.

¡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 *