.NET 5中使用System.Text.Json反序列化时如何处理多格式range字段?
处理System.Text.Json中单个值/数组混合的反序列化问题
要解决单个字符串/数组混合的反序列化异常问题,最直接的方案是自定义Json转换器,让转换器自动识别JSON令牌类型,将单个值包装为列表元素,数组则正常解析。
步骤1:实现自定义Json转换器
创建继承自JsonConverter<List<dynamic>>的转换器类,在Read方法中处理两种场景:
using System; using System.Collections.Generic; using System.Text.Json; using System.Text.Json.Serialization; public class SingleOrArrayConverter : JsonConverter<List<dynamic>> { public override List<dynamic> Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { var result = new List<dynamic>(); // 处理数组类型 if (reader.TokenType == JsonTokenType.StartArray) { result = JsonSerializer.Deserialize<List<dynamic>>(ref reader, options); } // 处理单个值类型(字符串、数字等) else { var singleValue = JsonSerializer.Deserialize<dynamic>(ref reader, options); result.Add(singleValue); } return result; } public override void Write(Utf8JsonWriter writer, List<dynamic> value, JsonSerializerOptions options) { // 序列化时统一输出为数组(如需自定义格式可修改此处逻辑) JsonSerializer.Serialize(writer, value, options); } }
步骤2:将转换器应用到目标模型字段
在你的模型类中,给range字段添加[JsonConverter]特性,指定使用上述自定义转换器:
public class TargetModel { [JsonPropertyName("range")] [JsonConverter(typeof(SingleOrArrayConverter))] public List<dynamic> Range { get; set; } }
步骤3:测试三种场景
现在三种JSON格式都能正常反序列化,且不会抛出异常:
// 数字数组场景 var jsonNumericArray = @"{""range"": [0, 100]}"; var model1 = JsonSerializer.Deserialize<TargetModel>(jsonNumericArray); // model1.Range 结果:[0, 100] // 字符串数组场景 var jsonStringArray = @"{""range"": [""yes"", ""no""]}"; var model2 = JsonSerializer.Deserialize<TargetModel>(jsonStringArray); // model2.Range 结果:["yes", "no"] // 单个字符串场景 var jsonSingleString = @"{""range"": ""n/a""}"; var model3 = JsonSerializer.Deserialize<TargetModel>(jsonSingleString); // model3.Range 结果:["n/a"]
扩展说明
如果不需要dynamic类型,也可以将转换器和模型字段的类型改为List<object>或List<string>,根据实际业务需求调整即可。
内容的提问来源于stack exchange,提问作者ringhat
相关产品推荐
相关产品推荐

