首页 >后端开发 >C++ >如何使用 System.Text.Json 将嵌套 JSON 反序列化为具有正确 C# 类型的嵌套对象字典?

如何使用 System.Text.Json 将嵌套 JSON 反序列化为具有正确 C# 类型的嵌套对象字典?

Linda Hamilton
Linda Hamilton原创
2024-12-25 02:40:17956浏览

How to Deserialize Nested JSON to a Nested Dictionary of Objects with Proper C# Types Using System.Text.Json?

使用正确的 C# 类型将嵌套 JSON 反序列化为对象的嵌套字典

在 C# .Net Core 3.1 中使用 System.Text.Json,反序列化将 JSON 对象嵌套到 Dictionary可能会导致每个对象都是 JsonElement。但是,我们可以自定义反序列化过程,为每个 JSON 属性类型获取正确的 C# 类型:

自定义 JsonConverter: ObjectAsPrimitiveConverter

As System.Text.Json 缺少内置 -为了支持将自由格式的 JSON 反序列化为原始类型,我们需要一个自定义的 JsonConverter, ObjectAsPrimitiveConverter,它提供以下功能:

  • 转换字符串: JSON 字符串属性到 C# 字符串
  • 转换数字: C# 的 JSON 数字属性int/double
  • 转换对象: JSON 对象属性到字典

代码实现:

public class ObjectAsPrimitiveConverter : JsonConverter<object>
{
    // Configure converter settings (float format, unknown number handling, object format)
    ...

    public override void Write(Utf8JsonWriter writer, object value, JsonSerializerOptions options)
    {
        // Handle custom serialization if needed
    }

    public override object Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
    {
        // Handle custom deserialization based on token type
    }
}

配置和用法:

要使用自定义转换器,请使用 ObjectAsPrimitiveConverter 配置 JsonSerializerOptions 并指定所需的设置:

var options = new JsonSerializerOptions
{
    Converters = { new ObjectAsPrimitiveConverter() },
    WriteIndented = true,
};

// Deserialize to object or dynamic
dynamic d = JsonSerializer.Deserialize<dynamic>(json, options);

注释:

  • 转换器处理边缘情况,例如具有任意精度的数字,这可能不适合原始 C# 类型。它提供了错误处理或返回此类数字的 JsonElement 的选项。
  • 您可以配置转换器以使用不同的浮点格式(双精度/十进制)和对象表示形式(字典或 ExpandoObject)。
  • 有演示小提琴可供参考。

以上是如何使用 System.Text.Json 将嵌套 JSON 反序列化为具有正确 C# 类型的嵌套对象字典?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn