将嵌套 JSON 反序列化为嵌套字典
在.NET Core 3.1中,System.Text.Json提供了反序列化JSON的标准方法。默认情况下,JSON 对象会反序列化为 JsonElement 对象,这些对象提供对 JSON 数据结构的访问,但不会自动将值转换为其对应的 C# 类型。
问题:
目标是将嵌套的 JSON 对象反序列化为 Dictionary
解决方案:
要实现这一点,名为 ObjectAsPrimitiveConverter 的自定义 JsonConverter 是必要的,因为 System.Text.Json 不提供此特定类型转换的开箱即用功能。
ObjectAsPrimitiveConverter 提供以下功能:
类型感知反序列化:
数字处理:
对象处理:
实现:
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);
注释:
以上是如何在 .NET Core 中将嵌套 JSON 反序列化为具有类型区分的嵌套字典?的详细内容。更多信息请关注PHP中文网其他相关文章!