首页 > 后端开发 > C++ > 如何在 .NET Core 中将嵌套 JSON 反序列化为具有类型区分的嵌套字典?

如何在 .NET Core 中将嵌套 JSON 反序列化为具有类型区分的嵌套字典?

DDD
发布: 2024-12-29 08:04:13
原创
892 人浏览过

How to Deserialize Nested JSON into a Nested Dictionary with Type Discrimination in .NET Core?

将嵌套 JSON 反序列化为嵌套字典具有类型歧视

在.NET Core 3.1中,System.Text.Json提供了反序列化JSON的标准方法。默认情况下,JSON 对象会反序列化为 JsonElement 对象,这些对象提供对 JSON 数据结构的访问,但不会自动将值转换为其对应的 C# 类型。

问题:

目标是将嵌套的 JSON 对象反序列化为 Dictionary,但对 JSON 属性进行以下类型区分值:

  • 字符串作为字符串
  • 数字作为 int/double
  • 对象作为字典

解决方案:

要实现这一点,名为 ObjectAsPrimitiveConverter 的自定义 JsonConverter 是必要的,因为 System.Text.Json 不提供此特定类型转换的开箱即用功能。

ObjectAsPrimitiveConverter 提供以下功能:

  • 类型感知反序列化:

    • 将字符串转换为字符串
    • 根据用户可配置的格式将数字转换为 int/double
    • 将对象转换为 Dictionary
  • 数字处理:

    • 支持浮点数的双精度或小数精度
    • 包括一个选项,用于将不支持的数字处理为 JsonElements 或 throw异常
  • 对象处理:

    • 允许用户选择使用Dictionary或 ExpandoObject 对象

实现:

public class ObjectAsPrimitiveConverter : JsonConverter<object>
{
    // Configuration options
    FloatFormat FloatFormat { get; init; }
    UnknownNumberFormat UnknownNumberFormat { get; init; }
    ObjectFormat ObjectFormat { get; init; }

    public ObjectAsPrimitiveConverter()
        : this(FloatFormat.Double, UnknownNumberFormat.Error, ObjectFormat.Expando)
    {
    }

    public ObjectAsPrimitiveConverter(
        FloatFormat floatFormat,
        UnknownNumberFormat unknownNumberFormat,
        ObjectFormat objectFormat)
    {
        this.FloatFormat = floatFormat;
        this.UnknownNumberFormat = unknownNumberFormat;
        this.ObjectFormat = objectFormat;
    }

    // ... implementation details ...
}

public enum FloatFormat
{
    Double,
    Decimal,
}

public enum UnknownNumberFormat
{
    Error,
    JsonElement,
}

public enum ObjectFormat
{
    Expando,
    Dictionary,
}
登录后复制

用法:

将 JSON 反序列化为动态对象(或 ExpandoObject,如果已配置)使用 ObjectAsPrimitiveConverter,在 JsonSerializerOptions 中指定转换器,如下所示:

var options = new JsonSerializerOptions
{
    Converters = { new ObjectAsPrimitiveConverter(floatFormat : FloatFormat.Double, unknownNumberFormat : UnknownNumberFormat.Error, objectFormat : ObjectFormat.Expando) },
    WriteIndented = true,
};
dynamic d = JsonSerializer.Deserialize<dynamic>(json, options);
登录后复制

注释:

  • JSON 允许任意精度和大小的数字,而.NET 原始数字类型则不然。如果 JSON 数字无法解析为 .NET 基元类型,转换器提供返回该数字的 JsonElement 或引发异常的选项。
  • 转换器可以配置为使用双精度或十进制精度对于浮点数和 Dictionary或 ExpandoObject 用于 JSON 对象。

以上是如何在 .NET Core 中将嵌套 JSON 反序列化为具有类型区分的嵌套字典?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板