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

C#中JsonConverter处理JSON单对象与数组转换的反序列化错误排查

修复反序列化错误的解决方案

问题核心在于两层嵌套结构都存在单个对象/数组的兼容需求:你只给Response类的qualifiers属性配置了转换器,但Qualifiers类的qualifier属性同样面临单个JSON对象转List<Qualifier>的场景,这才是触发错误的根源。

步骤1:给Qualifiers类的qualifier属性添加转换器

修改Qualifiers类,为qualifier字段添加SingleOrArrayConverter<Qualifier>转换器特性:

public class Qualifier
{
    public string key { get; set; }
    public string message { get; set; }
}

public class Qualifiers
{
    [JsonProperty("qualifier")]
    [JsonConverter(typeof(SingleOrArrayConverter<Qualifier>))] // 添加此行
    public List<Qualifier> qualifier { get; set; }
}

public class Response
{ 
    [JsonProperty("qualifiers", NullValueHandling = NullValueHandling.Ignore)]
    [JsonConverter(typeof(SingleOrArrayConverter<Qualifiers>))]
    public List<Qualifiers> qualifiers { get; set; }
}

步骤2:添加根对象类匹配JSON结构

你的JSON最外层是response节点,需要新增一个根类来对应整个JSON结构:

public class RootObject
{
    public Response response { get; set; }
}

步骤3:修正转换器的拼写小问题(可选但推荐)

你的SingleOrArrayConverter类中CanConvert方法的参数拼写错误(objecType → objectType),修正后更规范:

public class SingleOrArrayConverter<T> : JsonConverter
{
    public override bool CanConvert(Type objectType) // 修正参数名
    {
        return (objectType == typeof(List<T>));
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue,
        JsonSerializer serializer)
    {
        JToken token = JToken.Load(reader);
        if (token.Type == JTokenType.Array)
        {
            return token.ToObject<List<T>>();
        }
        return new List<T> { token.ToObject<T>() };
    }

    public override bool CanWrite
    {
        get { return false; }
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }
}

步骤4:正确反序列化

使用RootObject作为反序列化的目标类型:

string json = @"你的JSON字符串";
var result = JsonConvert.DeserializeObject<RootObject>(json);

这样就能同时处理以下三种场景:

  • qualifiers是数组、qualifier是数组
  • qualifiers是数组、qualifier是单个对象
  • qualifiers是单个对象、qualifier是单个对象

内容的提问来源于stack exchange,提问作者1moreLearner

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 13:45:00