使用Newtonsoft JSON反序列化时List属性FoodPositions始终为null的问题
解决Newtonsoft JSON反序列化时
FoodPositions属性为null的问题 我之前也碰到过一模一样的情况,多半是属性映射不匹配或者类定义的小疏漏导致的,咱们一步步排查解决:
可能的原因及对应解决方案
1. 未给FoodPositions添加正确的JsonProperty特性
你贴的类定义没写完,但从JSON里的foodPositions字段来看,如果你类里的属性是FoodPositions,必须给它加上对应的JsonProperty特性指定JSON键名——毕竟Newtonsoft默认会按PascalCase(首字母大写)去匹配,而JSON里是驼峰式的foodPositions,大小写不匹配自然映射不上。
补全后的正确类定义应该是这样:
class BaxterResult { [JsonProperty("baxterPosition")] public string BaxterPosition { get; set; } [JsonProperty("baxterFoodLevel")] public int BaxterFoodLevel { get; set; } [JsonProperty("mousePosition")] public string MousePosition { get; set; } [JsonProperty("mouseFoodLevel")] public int MouseFoodLevel { get; set; } // 关键:这里必须加上[JsonProperty("foodPositions")] [JsonProperty("foodPositions")] public List<string> FoodPositions { get; set; } [JsonProperty("totalRounds")] public int TotalRounds { get; set; } [JsonProperty("gameComplete")] public bool GameComplete { get; set; } }
2. 属性类型不匹配
确认你的FoodPositions属性类型是List<string>(或者IList<string>、string[]也可以),因为JSON里的foodPositions是字符串数组。如果你误把它定义成了其他类型(比如List<自定义对象>或者int[]),反序列化时会直接失败,导致属性值为null。
3. 检查属性的访问修饰符
确保FoodPositions是public的,Newtonsoft默认只会反序列化public的属性/字段,要是你把它设成了private或者protected,肯定拿不到值。
测试验证
用你给出的JSON字符串测试一下:
string json = @"{""baxterPosition"":""2x5"",""baxterFoodLevel"":18,""mousePosition"":""5x0"",""mouseFoodLevel"":18,""foodPositions"":[""0x0"",""5x5""],""totalRounds"":2,""gameComplete"":false}"; BaxterResult result = JsonConvert.DeserializeObject<BaxterResult>(json); // 现在result.FoodPositions应该会包含["0x0", "5x5"]了
另外,如果你不想给每个属性都加JsonProperty,也可以配置Newtonsoft的序列化设置,让它自动匹配驼峰命名:
var settings = new JsonSerializerSettings { ContractResolver = new CamelCasePropertyNamesContractResolver() }; BaxterResult result = JsonConvert.DeserializeObject<BaxterResult>(json, settings);
这样只要类里的属性名是PascalCase(比如FoodPositions),就能自动匹配JSON里的驼峰foodPositions,不用一个个加特性了。
内容的提问来源于stack exchange,提问作者daniel_sweetser
相关产品推荐
相关产品推荐

