Json.Net:SelectToken获取的JToken直接父节点路径未正确返回
为什么JToken的Parent.Path和自身Path相同?
这不是Bug哦,是Newtonsoft.Json里JToken.Path属性的设计逻辑导致的~
咱们先拆解下你的场景:你用..object这种深度搜索语法定位到了"value"这个JValue节点,它的直接父节点其实是JProperty类型的"object"键值对,而不是你以为的parent对象。而JProperty的Path属性设计就是返回它自身的完整路径(包含键名),所以才会和子节点JValue的Path完全一致。
正确获取父对象路径的方法
要拿到真正的parent对象的路径,你需要先判断当前节点的Parent是不是JProperty,如果是的话,再取这个JProperty的Parent,那才是你要的父对象。修改你的代码如下:
var input = "{'grandparent': { 'parent' : {'object' : 'value'}}}"; var jsonInput = JObject.Parse(input); var jsonObject = jsonInput.SelectToken("..object"); // 处理JProperty的情况,拿到真正的父对象 JToken actualParent = jsonObject.Parent; if (actualParent is JProperty property) { actualParent = property.Parent; } var realParentPath = actualParent.Path; // 此时返回 "grandparent.parent"
补充说明
在JSON的结构模型里,键值对是被封装成JProperty的:
JValue("value")的直接父是JProperty("object": "value")JProperty的父才是JObject(parent对象)
而JProperty的Path会包含它的键名,所以才会出现你看到的parent.Path和object.Path相同的情况,这是设计逻辑,不是Bug哦。
内容的提问来源于stack exchange,提问作者Chriss Cross
相关产品推荐
相关产品推荐

