获取JSON对象的绝对路径

Nig*_*ape 0 c# json json.net

我有一个 JSON 对象:

{
  ""settings"": {
    ""general"": {
      ""database"": { ""type"": ""PostgreSql"" }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

我的 JSON 对象的绝对路径如下所示:settings/general/database/type

我试图用这个问题的第一个解决方案获取所有密钥:

IList<string> keys = parent.Properties().Select(p => p.Name).ToList();
Run Code Online (Sandbox Code Playgroud)

这对我不起作用。该keys列表只包含第一个密钥settings,没有其他密钥。

有一个path属性显示您所在节点的路径,但它不显示 JSON 对象的完整路径。

在此输入图像描述

如何获得像我的示例中那样的绝对路径?

Bri*_*ers 5

在您的问题中,您询问如何获取“我的 JSON 对象”的路径,但您的示例 JSON 实际上包含四个嵌套对象。(每个对象都以 JSON 开头{和结尾}。)因此,路径会有所不同,具体取决于您引用的 JSON 对象。看起来您当前拥有对最外层对象的引用,您正在查询该对象以获取其属性的名称。但正如您所看到的,这不会为您提供后代属性​​。Path您需要的是从最里面的属性中获取。

所以我认为我们可以将你的问题归结为:

给定一些 JSON,如何获取层次结构中最深值(即叶节点)的完整路径?

您可以使用以下LINQ-to-JSON查询来做到这一点:

var obj = JObject.Parse(json);

var paths = obj.DescendantsAndSelf()
               .OfType<JProperty>()
               .Where(jp => jp.Value is JValue)
               .Select(jp => jp.Path)
               .ToList();
Run Code Online (Sandbox Code Playgroud)

如果您只想要第一个,则替换.ToList().FirstOrDefault()

请注意,返回的路径将以点作为分隔符。如果您更喜欢斜杠,请在方法调用中添加.Replace('.', '/')斜杠。jp.PathSelect()

此处的工作演示: https: //dotnetfiddle.net/lFXtEE