如何设置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类型的属性,不用处理数组逻辑,适配所有接口的响应结构:
- 先实现通用的单对象/数组兼容转换器
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); } }
- 给响应类的data属性加对应特性即可
public class ApiResponse { public string topic { get; set; } // 加特性自动兼容数组和单对象的返回 [JsonConverter(typeof(SingleOrArrayConverter<Data>))] public Data data { get; set; } }
该方案无需额外处理属性访问逻辑,反序列化时会自动把数组结构的data转换为单对象,业务层可以直接访问data属性,不用每次取数组第一个元素,更符合你统一所有接口响应结构的需求。
内容的提问来源于stack exchange,提问作者User2001
相关产品推荐
相关产品推荐

