将JObject转换成字典 可能吗?

我最终使用了两个答案的混合,因为没有一个真正地钉住它。

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

它可能在某些极端情况下无法正常工作,并且性能不是其最强的质量。

多谢你们!

解决方法

我有一个Web
API方法,可以将任意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))
    )
)

谢谢!

你可能想看:
分享给朋友: