【问题标题】:Converting dynamic type to dictionary C#将动态类型转换为字典 C#
【发布时间】:2014-03-30 15:12:28
【问题描述】:

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

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

如何将其转换为 dictionary

【问题讨论】:

  • 这看起来像 JSON。您是否正在寻找 JSON 反序列化Dictionary<K,V>
  • 您可以使用 Linq Group 方法。看这里:code.msdn.microsoft.com/LINQ-to-DataSets-Grouping-c62703ea
  • 它是什么对象? JSON字符串?还是 JSON 对象?或 KeyValuePair 列表?还是别的什么??
  • @OndrejTucny 实际上这是 JSON 反序列化的产物。这样做: Dictionary values = JsonConvert.DeserializeObject>(json) 问题中的“json”是我的字典中的值

标签: c# json dynamic dictionary json.net


【解决方案1】:

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

像这样使用它:

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

var result = new RouteValueDictionary(toBeConverted);

【讨论】:

  • 重新利用现有类的巧妙方法!
【解决方案2】:

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

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】:

如果有问题的动态值是通过 Json.Net 的反序列化创建的,正如您在 cmets 中提到的,那么它应该是 JObject。原来JObject已经实现了IDictionary&lt;string, JToken&gt;,所以不用任何转换就可以当字典使用,如下图:

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&lt;string, string&gt;,可以这样转换:

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

【讨论】:

    【解决方案4】:

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

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

    【讨论】:

    • 好的,但是string json = dynamicObject.ToString() 没有成功。你需要string json = JsonConvert.SerializeObject(dynamicObject);
    【解决方案5】:

    另一种方法是使用 .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

    问候, 马里亚诺C。

    【讨论】:

    • System.Web.Helpers 不包含在 .NET 4.5 中。
    【解决方案6】:

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

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

    【讨论】:

      【解决方案7】:

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

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

      【讨论】:

        【解决方案8】:

        如果你在这里使用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>
        

        在上面,标头集合很方便地创建为dynamic,但是,底层的具体实现是DDict,并且post() 方法接受它,即使您已将其声明为dynamic 和使用它的功能。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-08-17
          • 1970-01-01
          • 2012-03-01
          相关资源
          最近更新 更多