反序列化Newtonsoft生成的JSON时,List<int>所属List<object>为null
看起来你在反序列化Newtonsoft生成的JSON时,遇到了List<int>类型字段(比如示例里的AllowedAreaKinds)变成null的情况,我之前处理过类似的问题,大概率是实体类定义或反序列化配置的问题,下面给你几个排查和解决的方向:
1. 检查实体类的属性定义是否匹配
这是最常见的原因,首先确保目标类中对应字段的类型和名称完全匹配JSON结构:
比如针对你提供的JSON,正确的实体类应该是这样的(注意AllowedAreaKinds的类型是List<int>,不是List<object>):
public class AreaKind { public int ID { get; set; } public string Kind { get; set; } } public class AnimalRace { public int ID { get; set; } public string Race { get; set; } // 重点:这里必须是List<int>,写成List<object>会导致反序列化失败 public List<int> AllowedAreaKinds { get; set; } } public class Animal { public string Name { get; set; } } public class Area { public int ID { get; set; } public int AreaKindId { get; set; } public int Size { get; set; } public List<Animal> AnimalList { get; set; } } public class ZooData { public List<AreaKind> AreaKindList { get; set; } public List<AnimalRace> AnimalRaceList { get; set; } public List<Area> AreaList { get; set; } }
另外要注意:属性必须有公共的setter,如果是get; private set;这种,Newtonsoft无法给属性赋值,也会导致字段为null。
2. 检查属性名与JSON字段名是否一致
如果你的类属性名和JSON字段名不一致(比如大小写不同、命名风格不同),需要用JsonProperty特性显式映射:
比如如果类里把AllowedAreaKinds改成了AllowedAreaIds,就需要加上特性:
public class AnimalRace { [JsonProperty("ID")] public int Id { get; set; } [JsonProperty("Race")] public string SpeciesName { get; set; } [JsonProperty("AllowedAreaKinds")] public List<int> AllowedAreaIds { get; set; } }
3. 检查反序列化配置是否正确
有时候错误的序列化设置也会导致这个问题,比如设置了MissingMemberHandling = MissingMemberHandling.Error但字段不匹配,或者NullValueHandling的配置影响了赋值。建议用默认配置先测试,或者显式指定正确的设置:
string json = "你的JSON字符串"; var settings = new JsonSerializerSettings { MissingMemberHandling = MissingMemberHandling.Ignore, // 忽略JSON中存在但类中没有的字段 NullValueHandling = NullValueHandling.Include // 确保null值也被正确处理 }; var zooData = JsonConvert.DeserializeObject<ZooData>(json, settings);
4. 验证JSON格式是否完整
虽然你说JSON是Newtonsoft生成的,但也可以先验证一下JSON的完整性,比如示例里的AnimalList中的Name字段值是"Le...",确保实际JSON中这个字段是完整闭合的,没有语法错误。
按照上面的步骤排查后,基本就能解决List<int>字段反序列化后为null的问题了。
内容的提问来源于stack exchange,提问作者Marcel Grüger

