C#中嵌套JSON对象反序列化失败问题求助
C#中嵌套JSON对象反序列化失败问题求助
看起来你在给C#类添加嵌套JSON对象的反序列化逻辑时卡壳了,我帮你梳理下问题点和可行的解决办法:
首先,先看你代码里的几个明显问题:
- 你第二个版本的
clsDIOM类里,ctrl属性的定义少了分号:public clsCtrl ctrl { get; set },应该改成public clsCtrl ctrl { get; set; },这是语法错误,编译器肯定会报错,先把这个补上。
接下来是核心的反序列化匹配问题,System.Text.Json默认是大小写敏感的,这也是你嵌套对象反序列化失败的主要原因:
- 你的
clsCtrl类里的属性是Height、OffColour这种大驼峰命名,但JSON里对应的键是height、offcolour这种全小写,默认情况下两者匹配不上,所以ctrl对象的属性都会是null,甚至可能ctrl本身都无法正确实例化。 - 你第二个版本里给
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字段里的&是HTML转义后的&,实际JSON里应该直接用&,如果你的文件里是&,那属于无效JSON,需要先替换成&再反序列化,否则也会导致失败。
最后建议你先单独测试嵌套对象的反序列化,比如拿ctrl的JSON片段单独反序列化成clsCtrl,确认没问题后再测试整个对象,这样更容易定位问题。
内容来源于stack exchange
相关产品推荐
相关产品推荐

