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
相关产品推荐
相关产品推荐

