web-dev-qa-db-fra.com

Désérialiser la chaîne JSON en Dictionnaire <chaîne, objet>

J'ai cette chaîne:

[{ "processLevel" : "1" , "segments" : [{ "min" : "0", "max" : "600" }] }]

Je désérialise l'objet:

object json = jsonSerializer.DeserializeObject(jsonString);

L'objet ressemble à:

object[0] = Key: "processLevel", Value: "1"
object[1] = Key: "segments", Value: ...

Et en essayant de créer un dictionnaire:

Dictionary<string, object> dic = json as Dictionary<string, object>;

mais dic obtient null.

Quel peut être le problème ?

30
ohadinho

Voir la réponse de mridula pour savoir pourquoi vous obtenez null. Mais si vous souhaitez convertir directement la chaîne json en dictionnaire, vous pouvez essayer l'extrait de code suivant.

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

Le documentation MSDN pour le mot clé as indique que l'instruction expression as type Est équivalente à l'instruction expression is type ? (type)expression : (type)null. Si vous exécutez json.GetType(), il renverra System.Object[] Et non System.Collections.Generic.Dictionary.

Dans des cas comme ceux-ci où le type d'objet dans lequel je veux désérialiser un objet json est complexe, j'utilise une API comme Json.NET. Vous pouvez écrire votre propre désérialiseur comme:

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());   
    }
}

Et puis vous pouvez utiliser ce sérialiseur pour lire le json dans votre objet dictionnaire. Voici un exemple .

6
mridula

J'aime cette méthode:

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

Vous pouvez maintenant accéder à tout ce que vous voulez en utilisant le dictObj comme dictionnaire. Vous pouvez aussi utiliser Dictionary<string, string> si vous préférez obtenir les valeurs sous forme de chaînes.

5
Blairg23