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

C#大型JSON对象反序列化失败,提示类型需JSON数组错误如何解决

问题根因定位

报错已经明确指向 AdditionalCartInformation.ServiceInformation.ServiceInformationItem 节点,核心原因是你定义的ModifyCartReq类中对应节点的属性类型,和JSON实际结构不匹配:

  • 报错描述说明:反序列化器当前读取到的该节点是JSON对象结构,但你的C#类中该属性定义的是数组/集合类型,二者无法兼容。
  • 你贴出的示例JSON中ServiceInformationItem是数组结构,若你实际运行时的JSON中该节点偶尔会返回空对象{}而非空数组[],就会触发这个报错。
解决方法

方案1:修正类属性类型(适用于该节点永远返回数组的场景)

逐层级核对C#类定义,确保ServiceInformation类下的ServiceInformationItem属性为集合类型,示例正确定义如下:

public class ModifyCartReq
{
    public CartID CartID { get; set; }
    public object CustomerID { get; set; }
    public object PurchaseItems { get; set; }
    public object TenderInformation { get; set; }
    public object ModifyCartItems { get; set; }
    public AdditionalCartInformation AdditionalCartInformation { get; set; }
}

public class CartID
{
    public int ID { get; set; }
    public int AuthenticatedKey { get; set; }
}

public class AdditionalCartInformation
{
    public ServiceInformation ServiceInformation { get; set; }
}

public class ServiceInformation
{
    // 注意这里要定义为集合类型,匹配JSON数组结构
    public List<ServiceInformationItem> ServiceInformationItem { get; set; }
}

public class ServiceInformationItem
{
    public int ServiceID { get; set; }
}

方案2:自定义兼容转换器(适用于该节点可能返回对象/数组两种结构的场景)

如果接口返回逻辑不可控,ServiceInformationItem可能返回单个对象、空对象或者数组,可以自定义转换器兼容两种结构:

Newtonsoft.Json 转换器实现

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)
    {
        var token = JToken.Load(reader);
        if (token.Type == JTokenType.Array)
        {
            return token.ToObject<List<T>>();
        }
        // 兼容单个对象或空对象场景
        return new List<T> { token.Type == JTokenType.Object ? token.ToObject<T>() : default };
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        serializer.Serialize(writer, value);
    }
}

使用时给对应属性加特性即可:

[JsonConverter(typeof(SingleOrArrayConverter<ServiceInformationItem>))]
public List<ServiceInformationItem> ServiceInformationItem { get; set; }

System.Text.Json 额外注意事项

System.Text.Json默认不支持单引号包裹的JSON字符串,你当前的JSON用的是单引号,需要额外加配置:

var options = new JsonSerializerOptions
{
    AllowSingleQuotes = true
};
modifyCartReq = JsonSerializer.Deserialize<ModifyCartReq>(json_string, options);

如果需要兼容对象/数组两种结构,同理实现JsonConverter<List<T>>即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 23:45:03