C# JSON反序列化为类后StopBits值显示异常问题排查
问题原因及解决办法
核心问题
你遇到的问题是System.Text.Json默认不会处理类中的字段,即便加了[JsonInclude]属性,也需要显式配置序列化选项开启字段支持,否则反序列化时不会覆盖字段的默认值,导致StopBits始终是初始化的StopBits.One。
另外,你的代码注释里用的是Newtonsoft.Json的JsonConvert.DeserializeObject,但代码引用的是System.Text.Json.Serialization,如果实际反序列化用的是System.Text.Json,这点需要注意区分。
具体解决步骤
1. 反序列化时开启字段支持
调用JsonSerializer.Deserialize时,必须传入配置了IncludeFields = true的JsonSerializerOptions,让字段参与反序列化:
using System.Text.Json; // 读取JSON文件内容 string jsonContent = File.ReadAllText("你的配置文件路径.json"); // 配置序列化选项,开启字段支持 var options = new JsonSerializerOptions { IncludeFields = true, // 可选:兼容枚举数字与字符串转换的配置 Converters = { new JsonStringEnumConverter(allowIntegerValues: true) } }; // 执行反序列化 var settings = JsonSerializer.Deserialize<ClsSettings>(jsonContent, options);
2. 推荐:将字段改为自动属性
System.Text.Json默认优先处理属性而非字段,把ComSettings中的字段改为自动属性,可避免配置字段支持的麻烦,同时更符合C#编码规范:
public class ComSettings { public string ComSelection { get; set; } = ""; public string ComDeviceID { get; set; } = ""; public Int32 BaudRate { get; set; } = 9600; public Parity ComParity { get; set; } = Parity.None; public StopBits StopBits { get; set; } = StopBits.One; public int Datasize { get; set; } = 8; }
修改后反序列化无需额外配置,默认选项即可正常覆盖初始值。
3. 确认枚举值对应关系
System.IO.Ports.StopBits的枚举值与JSON数字对应关系如下,确保你的JSON值匹配:
StopBits.None = 0StopBits.One = 1StopBits.Two = 2StopBits.OnePointFive = 3
你的JSON中ServerSettings.StopBits = 2,对应StopBits.Two,反序列化正确后ToString()会输出Two。
内容的提问来源于stack exchange,提问作者Stefan Grönberg
相关产品推荐
相关产品推荐

