使用JsonConvert.DeserializeObject反序列化JSON返回默认值问题
解决JsonConvert.DeserializeObject反序列化后属性全为默认值的问题
问题原因
你直接将整个JSON字符串反序列化成Current类,但JSON的根结构包含location和current两个顶级属性,Current类的字段和根对象的字段完全不匹配,导致Json.NET无法找到对应的数据,所以返回的对象属性都是默认值。
解决方案
方案1:创建匹配整个JSON结构的根对象类
定义包含顶级属性的根类,先反序列化成根对象,再提取Current数据:
// 定义完整的JSON结构类 public class RootObject { public Location Location { get; set; } public Current Current { get; set; } } public class Location { public string Name { get; set; } } public class Current { public double Temp_c { get; set; } public double Cloud { get; set; } } // 反序列化代码 var root = JsonConvert.DeserializeObject<RootObject>(myJson); var current = root.Current; // 此时current的Temp_c为5.0,Cloud为50
方案2:直接定位到JSON中的current节点再反序列化
使用JObject解析JSON,先提取current部分的字符串,再反序列化成Current类:
using Newtonsoft.Json.Linq; var jsonObj = JObject.Parse(myJson); var currentJson = jsonObj["current"].ToString(); var current = JsonConvert.DeserializeObject<Current>(currentJson);
额外提示(可选)
如果遇到属性名映射问题(比如大小写或命名风格差异),可以用JsonProperty特性显式指定JSON字段名:
public class Current { [JsonProperty("temp_c")] public double Temp_c { get; set; } [JsonProperty("cloud")] public double Cloud { get; set; } }
内容的提问来源于stack exchange,提问作者Peng
相关产品推荐
相关产品推荐

