将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))
    )
)

谢谢!

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...