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

如何处理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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 16:36:04