You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 08:34:47