我最终使用了两个答案的混合,因为没有一个真正地钉住它。
ToObject()可以在JSON对象中执行第一级属性,但是嵌套对象不会转换为Dictionary()。
也不需要手动完成所有操作,因为ToObject()的第一级属性非常好。
这是代码:
public static class JObjectExtensions{ public static IDictionary<string, object> ToDictionary(this JObject @object) {var result = @object.ToObject<Dictionary<string, object>>();var JObjectKeys = (from r in result let key = r.Key let value = r.Value where value.GetType() == typeof(JObject) select key).ToList();var JArrayKeys = (from r in result let key = r.Key let value = r.Value where value.GetType() == typeof(JArray) select key).ToList();JArrayKeys.ForEach(key => result[key] = ((JArray)result[key]).Values().Select(x => ((JValue)x).Value).ToArray());JObjectKeys.ForEach(key => result[key] = ToDictionary(result[key] as JObject));return result; }}
它可能在某些极端情况下无法正常工作,并且性能不是其最强的质量。
多谢你们!
解决方法我有一个WebAPI方法,可以将任意json有效内容接受到JObject属性中。因此,我不知道会发生什么,但是我仍然需要将其转换为.NET类型。我想拥有一个Dictionary<string,object>以便可以按我想要的任何方式处理它。
我进行了很多搜索,但找不到任何东西,最终启动了一个麻烦的方法来进行此转换,一个键一个键,一个值一个值。有简单的方法吗?
输入->
JObject person = new JObject( new JProperty('Name','John Smith'),new JProperty('BirthDate',new DateTime(1983,3,20)),new JProperty('Hobbies',new JArray('Play football','Programming')),new JProperty('Extra',new JObject(new JProperty('Foo',1),new JProperty('Bar',new JArray(1,2,3)) ))
谢谢!