C#中反序列化JSON对象时所有字段均为null的问题
碰到反序列化后所有字段都为null的情况确实头疼,我帮你梳理几个最常见的原因和解决办法,一步步排查应该就能搞定!
1. 属性名称不匹配(最常见诱因)
你的JSON里有不少带下划线(比如first_name)、空格(比如Register Time)的字段,而C#类的属性默认是PascalCase命名(比如FirstName),两者名称不对应,反序列化器找不到匹配的字段,就会赋值为null。
解决办法是用JsonProperty特性手动映射字段名,示例如下:
// 定义嵌套的City类 public class City { [JsonProperty("id")] public int Id { get; set; } [JsonProperty("name")] public string Name { get; set; } [JsonProperty("created_at")] public DateTime CreatedAt { get; set; } [JsonProperty("updated_at")] public DateTime UpdatedAt { get; set; } } // 定义用户数据类 public class UserData { [JsonProperty("first_name")] public string FirstName { get; set; } [JsonProperty("last_name")] public string LastName { get; set; } [JsonProperty("Register Time")] public DateTime RegisterTime { get; set; } // 嵌套的city字段也要映射 [JsonProperty("city")] public City UserCity { get; set; } // 其他字段同理,逐个添加JsonProperty特性 }
2. 反序列化时用错了目标类型
你的JSON是两层结构:外层有status和data字段,实际的用户数据嵌套在data里。如果直接反序列化到UserData类,肯定拿不到数据,因为外层结构不匹配。
需要先定义外层的响应类:
public class ApiResponse { [JsonProperty("status")] public int Status { get; set; } [JsonProperty("data")] public UserData Data { get; set; } }
然后反序列化时指定外层类:
// 假设jsonString是你的JSON响应字符串 var apiResponse = JsonConvert.DeserializeObject<ApiResponse>(jsonString); // 此时apiResponse.Data里就有正确的用户数据了 var userFirstName = apiResponse.Data.FirstName;
3. 类或属性的访问修饰符不对
确保你的实体类和所有属性都是public的——反序列化器无法访问私有/内部的类或属性,自然只能返回null。比如不要写成class UserData(默认internal),必须是public class UserData。
4. 特殊值的类型不兼容
注意你的JSON里receive_regular_offer是字符串类型的"false",但JSON标准里布尔值是不带引号的false。如果C#属性定义为bool ReceiveRegularOffer,反序列化会失败,导致该字段为null(甚至可能整个反序列化失败)。
解决办法有两种:
- 临时把属性改成
string类型,之后在代码里手动转换为bool:
[JsonProperty("receive_regular_offer")] public string ReceiveRegularOfferStr { get; set; } // 用计算属性转换 public bool ReceiveRegularOffer => bool.TryParse(ReceiveRegularOfferStr, out var result) ? result : false;
- 自定义JSON转换器处理字符串转布尔:
public class StringToBoolConverter : JsonConverter<bool> { public override bool ReadJson(JsonReader reader, Type objectType, bool existingValue, bool hasExistingValue, JsonSerializer serializer) { var strValue = reader.Value?.ToString().Trim(); return bool.TryParse(strValue, out var boolValue) ? boolValue : false; } public override void WriteJson(JsonWriter writer, bool value, JsonSerializer serializer) { writer.WriteValue(value.ToString()); } } // 在属性上使用转换器 [JsonProperty("receive_regular_offer")] [JsonConverter(typeof(StringToBoolConverter))] public bool ReceiveRegularOffer { get; set; }
5. 验证JSON的完整性
你的JSON末尾有...,要确保实际的响应JSON是完整有效的,没有语法错误(比如缺失括号、逗号不匹配等)。可以把JSON粘贴到Visual Studio的“编辑>选择性粘贴>将JSON粘贴为类”功能里,自动生成类,同时也能验证JSON是否合法。
按照上面的步骤排查,应该就能解决字段全为null的问题啦!
内容的提问来源于stack exchange,提问作者Payman

