将动态类型转换为字典C#

时间:2014-02-27 09:31:37

标签: c# json dynamic dictionary json.net

我有一个看起来像这样的动态对象,

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

如何将其转换为dictionary

8 个答案:

答案 0 :(得分:29)

您可以使用RouteValueDictionary将C#对象转换为字典。见:RouteValueDictionary Class - MSDN。它会将object属性转换为键值对。

像这样使用它:

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

var result = new RouteValueDictionary(toBeConverted);

答案 1 :(得分:20)

如果有问题的动态值是通过您在评论中提到的Json.Net反序列化创建的,那么它应该是JObject。事实证明JObject已经实现了IDictionary<string, JToken>,因此您可以将其用作没有任何转化的字典,如下所示:

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

如果您希望改为使用Dictionary<string, string>,则可以将其转换为:

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

答案 2 :(得分:18)

您可以使用反射填充词典:

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

答案 3 :(得分:8)

您可以使用Json.Net将其反序列化为字典。

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

答案 4 :(得分:2)

另一种方法是使用.NET 4.5中包含的System.Web.Helpers.Json。

Json.Encode(object)和Json.Decode。像:

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

此致 MarianoC。

答案 5 :(得分:1)

与ema答案非常相似,但使用LINQ magic的单线:

Dictionary<string, object> myDict = sourceObject.GetType().GetProperties().ToDictionary(prop => prop.Name, prop => prop.GetValue(sourceObject, null));

答案 6 :(得分:0)

你可以用jsonSerializer做到这一点。它需要System.Net.Extensions参考。这是一个示例代码。

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

答案 7 :(得分:0)

如果您在此处使用 dynamic 实现:

https://github.com/b9chris/GracefulDynamicDictionary

您可以直接从实现中获取字典。使用上述实现(为回答 another SO question 而编写)的一个优点是,您可以轻松地在特定实现和动态之间切换,如下所示:

    dynamic headers = new DDict();
    headers.Authorization = token;
    if (doesNeedSiteId)
        headers.SiteId = siteId;
    
    await post(headers);
}

protected async Task post(DDict headers)
{
    var dict = headers.GetDictionary(); // Dictionary<string, object>

在上面,headers 集合被方便地创建为一个 dynamic,但是,底层的具体实现是 DDict,并且 post() 方法接受它,即使你已经声明将其作为 dynamic 并使用其功能。