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

多层JSON文件反序列化后下层数据访问与空值处理问题

问题根因

你当前配置不生效的核心原因是Stepdown和Stepover两个属性的类型和参数配置不匹配:

  • 两个属性声明为不可空的double值类型,若JSON中对应字段为null或字段缺失,反序列化时要么抛出类型转换错误,要么只会赋值为值类型默认值0,你加的NullValueHandling.Ignore配置无法生效。
  • NullValueHandling.Ignore在反序列化阶段的作用是:当JSON对应字段为null时,不修改类属性的原有值,不会跳过类型校验,因此不可空值类型收到null值时依然会报错。

对应解决方案

以下两个方案可匹配你的需求:

方案1:允许空值正常访问

如果需要明确感知这两个字段是否为空,直接把属性改为可空值类型即可,和你代码中FN、FZ等属性的处理逻辑一致:

[JsonProperty("stepdown", NullValueHandling = NullValueHandling.Ignore)]
public double? Stepdown { get; set; }

[JsonProperty("stepover", NullValueHandling = NullValueHandling.Ignore)]
public double? Stepover { get; set; }

后续取值时可以通过Stepdown.HasValue判断是否有有效值,或者用Stepdown.GetValueOrDefault(0)指定默认值取值,不会出现访问报错的问题。

方案2:忽略空值自动用默认值填充

如果不需要区分空值和0值,希望JSON中字段为空或缺失时自动填充默认值,调整属性配置如下:

// 配置反序列化时若字段缺失或为null,自动填充属性默认值
[JsonProperty("stepdown", DefaultValueHandling = DefaultValueHandling.IgnoreAndPopulate)]
public double Stepdown { get; set; } = 0; // 可自定义默认值

[JsonProperty("stepover", DefaultValueHandling = DefaultValueHandling.IgnoreAndPopulate)]
public double Stepover { get; set; } = 0;

如果是全局需要该规则,也可以在反序列化时统一配置:

var preset = JsonConvert.DeserializeObject<Preset>(jsonStr, new JsonSerializerSettings
{
    DefaultValueHandling = DefaultValueHandling.IgnoreAndPopulate,
    NullValueHandling = NullValueHandling.Ignore
});

内容的提问来源于stack exchange,提问作者Joe Fisher

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 16:06:10