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

C#中嵌套JSON对象反序列化失败问题求助

C#中嵌套JSON对象反序列化失败问题求助

看起来你在给C#类添加嵌套JSON对象的反序列化逻辑时卡壳了,我帮你梳理下问题点和可行的解决办法:

首先,先看你代码里的几个明显问题:

  • 你第二个版本的clsDIOM类里,ctrl属性的定义少了分号:public clsCtrl ctrl { get; set },应该改成public clsCtrl ctrl { get; set; },这是语法错误,编译器肯定会报错,先把这个补上。

接下来是核心的反序列化匹配问题,System.Text.Json默认是大小写敏感的,这也是你嵌套对象反序列化失败的主要原因:

  1. 你的clsCtrl类里的属性是Height、OffColour这种大驼峰命名,但JSON里对应的键是height、offcolour这种全小写,默认情况下两者匹配不上,所以ctrl对象的属性都会是null,甚至可能ctrl本身都无法正确实例化。
  2. 你第二个版本里给clsDIOM的ctrl属性去掉了[JsonPropertyName("ctrl")]特性,如果你的属性名是小写ctrl,那和JSON里的"ctrl"是匹配的,但如果是大写Ctrl就不行了——不过更稳妥的方式是明确加上特性,避免命名风格变化带来的问题。

给你两种具体的修复方案:

方案一:使用JsonPropertyName特性明确映射(推荐)

这种方式最清晰,不管类属性的命名风格是什么,都能精准对应JSON里的键:

// 嵌套的ctrl类,每个属性都加上对应JsonPropertyName
class clsCtrl
{
    [JsonPropertyName("height")]
    public string Height { get; set; }
    [JsonPropertyName("offcolour")]
    public string OffColour { get; set; }
    [JsonPropertyName("oncolour")]
    public string OnColour { get; set; }
    [JsonPropertyName("shape")]
    public string Shape { get; set; }
    [JsonPropertyName("type")]
    public string Type { get; set; }
    [JsonPropertyName("width")]
    public string Width { get; set; }
}

// 主类里的ctrl属性也加上特性
class clsDIOM
{
    [JsonPropertyName("columns")]
    public string Columns { get; set; }
    [JsonPropertyName("ctrl")]
    public clsCtrl Ctrl { get; set; } // 属性名可以用大驼峰,特性对应JSON的"ctrl"
    [JsonPropertyName("font")]
    public string Font { get; set; }
    // 其他属性保持你原来的JsonPropertyName配置...
    [JsonPropertyName("rslinx")]
    public string rsLinx { get; set; }
}

方案二:配置反序列化选项忽略大小写

如果你不想给每个属性加特性,可以在反序列化的时候传入配置选项,让System.Text.Json忽略大小写匹配:

string strFileContent = File.ReadAllText(mcstrFileSpec);
var options = new JsonSerializerOptions
{
    PropertyNameCaseInsensitive = true // 开启大小写不敏感匹配
};
mJSON = JsonSerializer.Deserialize<clsDIOM>(strFileContent, options);

这种方式下,你的clsCtrl和clsDIOM的属性名只要和JSON键的拼写一致(不管大小写)就能匹配上,比如Height对应height,ctrl对应ctrl。

另外还有两个需要注意的点:

  • 你第一个版本的clsDIOM有构造函数初始化Ctrl = new clsCtrl();,第二个版本去掉了——其实System.Text.Json会自动实例化引用类型的属性,只要你的clsCtrl有无参构造函数(默认是有的,除非你自定义了带参数的构造函数),所以这个构造函数不是必须的,但如果需要提前初始化的话可以保留。
  • 检查你的JSON字符串是否有效:比如rslinx字段里的&amp;是HTML转义后的&,实际JSON里应该直接用&,如果你的文件里是&amp;,那属于无效JSON,需要先替换成&再反序列化,否则也会导致失败。

最后建议你先单独测试嵌套对象的反序列化,比如拿ctrl的JSON片段单独反序列化成clsCtrl,确认没问题后再测试整个对象,这样更容易定位问题。

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.07 11:38:05