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
相关产品推荐
相关产品推荐

