我有一个动态对象,看起来像这样,
{
"2" : "foo",
"5" : "bar",
"8" : "foobar"
}
如何将其转换为dictionary
?
您可以使用反射填充字典:
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;
}
RouteValueDictionary
将 C# 对象转换为字典。请参见: 路由值字典类 - MSDN。它将object
属性转换为键值对。
像这样使用它:
var toBeConverted = new {
foo = 2,
bar = 5,
foobar = 8
};
var result = new RouteValueDictionary(toBeConverted);
如果所讨论的动态值是您在评论中提到的通过反序列化从 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());
Json.Net 将其反序列化为字典。
string json = dynamicObject.ToString(); // suppose `dynamicObject` is your input
Dictionary<string, string> dictionary = JsonConvert.DeserializeObject<Dictionary<string, string>>(json);
与 ema 答案非常相似,但使用单行使用 LINQ 魔法:
Dictionary<string, object> myDict = sourceObject.GetType().GetProperties().ToDictionary(prop => prop.Name, prop => prop.GetValue(sourceObject, null));
另一种方法是使用 .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
问候马里亚诺·
你可以用jsonSerializer来做到这一点。它需要 System.Net.Extensions 参考。下面是一个示例代码。
var jss = new JavaScriptSerializer();
var dict = jss.Deserialize<Dictionary<string,string>>(jsonText);
var place = dict["8"]; // "foobar"
如果您在此处使用 dynamic
实现:
https://github.com/b9chris/GracefulDynamicDictionary
您可以直接从实现中获取字典。使用上述实现(为回答另一个 SO 问题而编写)的一个优点是,您可以在特定实现和动态实现之间轻松切换,如下所示:
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
并使用了它的功能。
JSON文本转换为字典的单行解决方案:
IDictionary<string, object> dict = new JavaScriptSerializer().Deserialize<IDictionary<string, object>>(json);
然后
if (dict.ContainsKey("field1"))
string field1value = dict["field1"];