.net - 如何使用 JSON.NET 反序列化为嵌套/递归字典和列表?

标签 .net json json.net deserialization

我需要将复杂的 JSON blob 反序列化为标准 .NET 容器,以便在不了解 JSON 的代码中使用。它期望事物采用标准的 .NET 类型,特别是 Dictionary<string, object>List<object>其中“对象”可以是原始的或递归的(字典或列表)。

我不能使用静态类型来映射结果并且 JObject/JToken 不适合。理想情况下,应该有某种方法(也许是通过契约(Contract)?)将原始 JSON 转换为基本的 .NET 容器。

我一直在寻找任何方法来诱使 JSON.NET 反序列化器在遇到“{}”或“[]”时创建这些简单类型,但收效甚微。

任何帮助表示赞赏!

最佳答案

如果您只想要一个可以处理任意 JSON 并将其转换为常规 .NET 类型(基元、列表和字典)的嵌套结构的通用方法,您可以使用 JSON.Net 的 LINQ-to-JSON API这样做:

using System.Linq;
using Newtonsoft.Json.Linq;

public static class JsonHelper
{
    public static object Deserialize(string json)
    {
        return ToObject(JToken.Parse(json));
    }

    public static object ToObject(JToken token)
    {
        switch (token.Type)
        {
            case JTokenType.Object:
                return token.Children<JProperty>()
                            .ToDictionary(prop => prop.Name,
                                          prop => ToObject(prop.Value));

            case JTokenType.Array:
                return token.Select(ToObject).ToList();

            default:
                return ((JValue)token).Value;
        }
    }
}

您可以调用如下所示的方法。 obj将包含 Dictionary<string, object> , List<object> ,或原始的,具体取决于您开始使用的 JSON。

object obj = JsonHelper.Deserialize(jsonString);

关于.net - 如何使用 JSON.NET 反序列化为嵌套/递归字典和列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5546142/

相关文章:

c# - 为什么我的图像大小调整代码总是产生全黑的输出图像?

javascript - PhoneGap 的 JSON 加载问题

javascript - JS - 处理初始服务器响应以显示 JSON

javascript - 如何构建 MustacheJS 模板以根据 JSON 文件中的值添加动态类?

c# - 无法在 Azure Functions 中加载文件或程序集 'Newtonsoft.Json, Version=10.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed'

c# - 如何修复无法反序列化 JSON,与 key "1", "2"混淆

c# - 如何隐藏和显示窗体上的面板并调整其大小以占用空间?

c# - 使用c#在连续纸上打印

c# - 如何将大型 SQL 脚本解析成批处理?

c# - Json.NET反序列化为接口(interface)实现