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

System.Text.Json.JsonNode索引访问异常咨询:非JsonObject节点报错

.NET 6下System.Text.Json JsonNode链式访问异常问题

在.NET 6环境中使用System.Text.Json的JsonNode时,尝试通过((JsonNode)node)?["a"]?["b"]?["c"]这种带空值短路的链式访问方式获取嵌套属性时,出现了不符合预期的异常。现需确认该问题属于自身使用错误、文档描述问题还是框架Bug,不接受包装器、扩展方法这类替代方案。

示例代码

JsonNode rootNode = JsonNode.Parse(@"{""p"": ""v""}");

// 以下行为符合预期
_ = rootNode["a"]; // 正常返回null
// _ = rootNode["a"]["b"]; // 抛出NullReferenceException - 符合预期
_ = rootNode["a"]?["b"]; // 正常返回null - 符合预期
_ = rootNode["p"]; // 正常获取到值为"v"的JsonNode - 符合预期

// 以下行为不符合预期

// 意外抛出异常:The node must be of type 'JsonObject'
//_ = rootNode["p"]?["x"];

JsonNode p = rootNode["p"]; // 执行正常,p不为null

// 意外抛出异常:The node must be of type 'JsonObject'
// 按照文档描述,Item[String]应该返回指定属性名的元素,未找到则返回null
JsonNode x = p["x"]; 

异常信息

System.InvalidOperationException
  HResult=0x80131509
  Message=The node must be of type 'JsonObject'.
  Source=System.Text.Json
  StackTrace:
   at System.Text.Json.Nodes.JsonNode.AsObject()
   at System.Text.Json.Nodes.JsonNode.get_Item(String propertyName)
   at JTokenConditional.Program.Main(String[] args) in 

问题判定

问题的核心原因:rootNode["p"]返回的是JsonValue类型节点(对应JSON中的字符串值"v"),而非JsonObject类型。当对非JsonObject类型的JsonNode调用字符串索引器时,方法内部会强制调用AsObject()转换节点类型,转换失败直接抛出InvalidOperationException。

  • 这不属于自身使用问题:代码逻辑符合常规链式访问的直觉。
  • 这属于文档描述缺陷:现有文档仅说明索引器会返回指定属性元素或null,但未明确标注——只有JsonObject类型节点支持字符串索引访问,非对象类型节点调用该索引器会抛出异常而非返回null。
  • 这是.NET 6框架的既定行为,并非Bug,但该行为和开发者的直觉预期不符。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 00:31:00