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

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 = 0
  • StopBits.One = 1
  • StopBits.Two = 2
  • StopBits.OnePointFive = 3
    你的JSON中ServerSettings.StopBits = 2,对应StopBits.Two,反序列化正确后ToString()会输出Two。

内容的提问来源于stack exchange,提问作者Stefan Grönberg

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 22:30:25