You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#中反序列化JSON对象时所有字段均为null的问题

解决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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:18:40