JSON.net反序列化:将嵌套对象转为C#单列表的解决方案
解决JSON.net反序列化嵌套对象为List的问题
嗨,这个问题我之前也碰到过!你的JSON响应里variants字段其实是一个键值对结构的对象(键是每个variant的ID,值是对应的Variant实体),但你在C#的Feature类里把它声明成了List<Variant>,这就是反序列化失败的核心原因。下面给你两种实用的解决办法:
方法1:修改属性类型为Dictionary<string, Variant>(最简单)
这种方法不需要额外编写转换器,直接调整Feature类的属性类型即可:
public partial class Feature { // 其他属性保持不变 [JsonProperty("variants")] // 把List<Variant>改成Dictionary<string, Variant> public Dictionary<string, Variant> Variants { get; set; } }
反序列化完成后,如果你需要将其转为List<Variant>,只需要提取字典的Values集合即可:
var feature = Feature.FromJson(yourJsonString); List<Variant> variantList = feature.Variants.Values.ToList();
方法2:自定义JsonConverter(保留List类型)
如果你不想修改属性类型,希望依然用List<Variant>来接收,可以编写一个自定义转换器,自动把JSON的键值对对象转为List:
步骤1:创建自定义转换器类
public class VariantListConverter : JsonConverter<List<Variant>> { public override List<Variant> ReadJson(JsonReader reader, Type objectType, List<Variant> existingValue, bool hasExistingValue, JsonSerializer serializer) { // 将JSON对象反序列化为字典,再提取值转为List var variantDictionary = serializer.Deserialize<Dictionary<string, Variant>>(reader); return variantDictionary?.Values.ToList() ?? new List<Variant>(); } public override void WriteJson(JsonWriter writer, List<Variant> value, JsonSerializer serializer) { // 如果需要序列化回JSON,将List转为以VariantId为键的字典 var variantDictionary = value.ToDictionary(v => v.VariantId, v => v); serializer.Serialize(writer, variantDictionary); } }
步骤2:给Variants属性添加转换器标记
修改Feature类里的Variants属性,加上JsonConverter特性:
public partial class Feature { // 其他属性保持不变 [JsonProperty("variants")] [JsonConverter(typeof(VariantListConverter))] public List<Variant> Variants { get; set; } }
这样配置后,JSON.net会自动使用你编写的转换器,把variants的键值对对象转为List<Variant>,完全符合你的需求。
另外检查了你的Variant类,[JsonProperty("variant")]对应public string VariantVariant { get; set; }的映射是正确的,不需要调整。
内容的提问来源于stack exchange,提问作者Luminai
相关产品推荐
相关产品推荐

