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

如何设置C#属性get/set使单元素Data类反序列化时被视为数组

栈溢出原因

你代码中出现栈溢出的核心原因是属性访问器的递归调用:get块中的return data、set块中的data = value都是直接访问属性本身,会无限触发对应的访问器逻辑,最终导致栈溢出。

解决方案

方案1:修正属性的 backing field 实现

如果需要对外统一暴露Data[]类型的data属性,可以调整字段存储逻辑,避免递归调用:

// 私有存储字段,不要直接访问属性本身
private Data _singleData;
private Data[] _arrayData;

public Data[] data 
{ 
    get 
    { 
        if (_singleData != null) 
        { 
            return new[] { _singleData }; 
        } 
        return _arrayData ?? Array.Empty<Data>(); 
    } 
    set 
    { 
        if (value == null)
        {
            _singleData = null;
            _arrayData = null;
            return;
        }
        // 长度为1时存到单对象字段
        if (value.Length == 1) 
        { 
            _singleData = value[0];
            _arrayData = null;
        } 
        // 多数据时存到数组字段
        else 
        { 
            _arrayData = value;
            _singleData = null;
        } 
    } 
}

方案2:使用Newtonsoft.Json自定义转换器(更适配你的场景)

你是在接口反序列化场景下遇到的单对象/数组兼容问题,更推荐用自定义JsonConverter实现,对外可以统一暴露Data类型的属性,不用处理数组逻辑,适配所有接口的响应结构:

  1. 先实现通用的单对象/数组兼容转换器
public class SingleOrArrayConverter<T> : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        return objectType == typeof(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>>().FirstOrDefault();
        }
        return token.ToObject<T>();
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        serializer.Serialize(writer, value);
    }
}
  1. 给响应类的data属性加对应特性即可
public class ApiResponse
{
    public string topic { get; set; }
    // 加特性自动兼容数组和单对象的返回
    [JsonConverter(typeof(SingleOrArrayConverter<Data>))]
    public Data data { get; set; }
}

该方案无需额外处理属性访问逻辑,反序列化时会自动把数组结构的data转换为单对象,业务层可以直接访问data属性,不用每次取数组第一个元素,更符合你统一所有接口响应结构的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 14:18:05