web-dev-qa-db-fra.com

Conversion d'un type dynamique en dictionnaire C #

J'ai un objet dynamique qui ressemble à ça,

 {
    "2" : "foo",
    "5" : "bar",
    "8" : "foobar"
 }

Comment puis-je le convertir en dictionary?

17
Kristian Nissen

Vous pouvez utiliser un RouteValueDictionary pour convertir un objet C # en dictionnaire. Voir: Classe RouteValueDictionary - MSDN . Il convertit les propriétés object en paires clé-valeur.

Utilisez-le comme ceci:

var toBeConverted = new {
    foo = 2,
    bar = 5,
    foobar = 8
};

var result = new RouteValueDictionary(toBeConverted);
31
annemartijn

Si la valeur dynamique en question a été créée via la désérialisation de Json.Net comme vous l'avez mentionné dans vos commentaires, alors ce devrait être un JObject . Il s'avère que JObject implémente déjà IDictionary<string, JToken>, vous pouvez donc l'utiliser comme dictionnaire sans aucune conversion, comme illustré ci-dessous:

string json = 
     @"{ ""blah"" : { ""2"" : ""foo"", ""5"" : ""bar"", ""8"" : ""foobar"" } }";

var dict = JsonConvert.DeserializeObject<Dictionary<string, dynamic>>(json);
dynamic dyn = dict["blah"];

Console.WriteLine(dyn.GetType().FullName);     // Newtonsoft.Json.Linq.JObject
Console.WriteLine(dyn["2"].ToString());        // foo

Si vous préférez avoir un Dictionary<string, string> à la place, vous pouvez le convertir comme ceci:

Dictionary<string, string> newDict = 
          ((IEnumerable<KeyValuePair<string, JToken>>)dyn)
                     .ToDictionary(kvp => kvp.Key, kvp => kvp.Value.ToString());
21
Brian Rogers

Vous pouvez remplir le dictionnaire par réflexion:

public Dictionary<String, Object> Dyn2Dict(dynamic dynObj)
{
     var dictionary = new Dictionary<string, object>();
     foreach (PropertyDescriptor propertyDescriptor in TypeDescriptor.GetProperties(dynObj))
     {
        object obj = propertyDescriptor.GetValue(dynObj);
        dictionary.Add(propertyDescriptor.Name, obj);
     }
     return dictionary;
}
19
ema

Vous pouvez utiliser Json.Net pour le désérialiser en dictionnaire.

string json = dynamicObject.ToString(); // suppose `dynamicObject` is your input
Dictionary<string, string> dictionary = JsonConvert.DeserializeObject<Dictionary<string, string>>(json);
8
Wasif Hossain

Une autre façon consiste à utiliser System.Web.Helpers.Json inclus dans .NET 4.5.

Json.Encode (objet) et Json.Decode. Comme:

Json.Decode<Generic.Dictionary<string, string>>(value);

MSDN: https://msdn.Microsoft.com/en-us/library/gg547931 (v = vs.111) .aspx? Cs-save-lang = 1 & cs-lang = csharp # code-snippet-1

Cordialement, MarianoC.

3
MarianoC

Vous pouvez le faire avec jsonSerializer. Et cela nécessite une référence System.Net.Extensions. Voici un exemple de code.

var jss = new JavaScriptSerializer();
var dict = jss.Deserialize<Dictionary<string,string>>(jsonText);
var place = dict["8"]; // "foobar"
0
Anıl Canlı