我有一个动态对象,长这样:
{
"2" : "foo",
"5" : "bar",
"8" : "foobar"
}
我怎样才能将它转换成一个字典
?
我有一个动态对象,长这样:
{
"2" : "foo",
"5" : "bar",
"8" : "foobar"
}
我怎样才能将它转换成一个字典
?
您可以使用反射填充字典:
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#对象转换为字典。请参阅:RouteValueDictionary类-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());
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);
。 - derloopkatDictionary<string, object> myDict = sourceObject.GetType().GetProperties().ToDictionary(prop => prop.Name, prop => prop.GetValue(sourceObject, null));
Json.Decode<Generic.Dictionary<string, string>>(value);
祝好,MarianoC.
System.Web.Helpers
在 .NET 4.5 中未被包含。 - nawfalvar 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
,而且即使你声明为dynamic
并使用其特性,post()
方法也可以接受它。IDictionary<string, object> dict = new JavaScriptSerializer().Deserialize<IDictionary<string, object>>(json);
那么
if (dict.ContainsKey("field1"))
string field1value = dict["field1"];
Dictionary<K,V>
的方法? - Ondrej Tucny