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

