如何处理API返回属性有时为数组有时为对象的JSON反序列化问题
问题原因
- 你当前返回的JSON结构中,
payment字段对应的值是空数组[],但你定义的OrderItem类中Payment属性为单个OrderItemPayment对象类型,JSON解析器无法将数组类型直接映射到单个对象,因此出现反序列化异常/不符合预期的结果。
解决方案
根据你的业务场景可以选择以下任意一种处理方式:
方案1:修改属性类型适配数组结构
如果业务逻辑中payment确实允许返回多条支付记录,直接将属性修改为集合类型即可:
[Serializable] public class OrderItem { [JsonProperty("created_at")] public string? CreatedAt { get; set; } // 修改为数组或者List类型 [JsonProperty("payment")] public OrderItemPayment[]? Payment { get; set; } }
方案2:自定义转换器兼容「空数组/单个对象」两种格式
如果接口存在兼容问题,无数据时返回空数组、有数据时返回单个对象,可以通过自定义JsonConverter处理兼容:
public class SingleObjectOrEmptyArrayConverter<T> : JsonConverter<T> { public override T ReadJson(JsonReader reader, Type objectType, T existingValue, bool hasExistingValue, JsonSerializer serializer) { switch (reader.TokenType) { case JsonToken.StartArray: // 跳过空数组,返回默认值 reader.Read(); if (reader.TokenType == JsonToken.EndArray) { return default; } // 如果数组里有值,取第一个元素 var value = serializer.Deserialize<T>(reader); reader.Read(); return value; case JsonToken.StartObject: return serializer.Deserialize<T>(reader); default: return default; } } public override void WriteJson(JsonWriter writer, T value, JsonSerializer serializer) { serializer.Serialize(writer, value); } }
给对应属性添加转换器特性即可:
[JsonProperty("payment")] [JsonConverter(typeof(SingleObjectOrEmptyArrayConverter<OrderItemPayment>))] public OrderItemPayment Payment { get; set; } = new OrderItemPayment();
方案3:调整接口返回逻辑
如果接口设计上payment就是单个对象,无数据时应该返回null而非空数组,调整接口返回结构为"payment": null即可匹配你当前的类定义。
内容的提问来源于stack exchange,提问作者Hannes
相关产品推荐
相关产品推荐

