You need to enable JavaScript to run this app. C# Newtonsoft.Json 访问嵌套JSON报JValue无法访问子值问题与默认值需求
优惠活动
大模型
产品
解决方案
定价
更多

C# Newtonsoft.Json 访问嵌套JSON报JValue无法访问子值问题与默认值需求

Newtonsoft.Json 访问嵌套字段报错 Cannot access child value on JValue 解决方案

错误根因

  • 原判断逻辑c["extendedData"]["e_ETP"] != null存在漏洞:Newtonsoft.Json 会将 JSON 中的null值解析为JValue类型的Null实例,而非C#空引用,因此该判断始终为真。
  • 当e_ETP为JSON null时,代码会进入三元表达式的取值分支,尝试在JValue上访问["value"]子属性,直接触发报错。
  • 只有当extendedData中完全不存在e_ETP字段时,该索引器才会返回C# null,和预期的“JSON null即C# null”的行为不一致。

修正后实现

优先判断e_ETP对应的JToken是否为含value字段的JObject类型,校验通过再取值,否则使用默认值"1"。
修正后的核心代码:

salaries = rep["data"]["items"].Where(c => (string)c["name"] != "lad" && (int?)c["legalEntityID"] != 10).Select(c => new T_E_LuccaSalarie_LUS()
{
    LUS_ETP = (c["extendedData"]["e_ETP"] is JObject etpObj && etpObj["value"] != null) 
        ? etpObj["value"].ToString() 
        : "1"
}).ToList();

兼容扩展

如果接口存在e_ETP直接返回基础类型值(无外层value对象)的场景,可使用如下兼容写法覆盖所有合法返回值:

LUS_ETP = c.SelectToken("extendedData.e_ETP") switch
{
    JObject etpObj when etpObj["value"] != null => etpObj["value"].ToString(),
    JValue etpVal when etpVal.Type != JTokenType.Null => etpVal.ToString(),
    _ => "1"
}

额外优化建议

  • 优先使用SelectToken方法做路径取值,可避免逐层索引时的空引用异常,即使extendedData字段本身缺失也能安全返回null。
  • 如需更严谨的类型转换,可将ToString()替换为显式类型转换,根据value字段的实际类型适配即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.07 10:36:02