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 ?
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);
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 .
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.