在Json.NET中查找任何节点

在Json.NET中查找任何节点,.net,json,json.net,.net,Json,Json.net,我正在使用NewtonSoft Json.NET库解析.NET应用程序中的Json文件。 我需要做的是传递一个节点的名称,并获取该节点(如果它存在的话),而不考虑它们的级别,这在之前是未知的 例如,在文件中: string json = @"{ ""Name"": ""Apple"", ""Expiry"": new Date(1230422400000), ""Price"": 3.99, ""ATest"": { ""MyTest"": [ ""

我正在使用NewtonSoft Json.NET库解析.NET应用程序中的Json文件。 我需要做的是传递一个节点的名称,并获取该节点(如果它存在的话),而不考虑它们的级别,这在之前是未知的

例如,在文件中:

string json = @"{
  ""Name"": ""Apple"",
  ""Expiry"": new Date(1230422400000),
  ""Price"": 3.99,
  ""ATest"": {
    ""MyTest"":
    [
       ""blah"",
       ""blah""
    ]
  }
}";

有没有一种方法可以只使用值
“MyTest”
来获取该节点,而不必知道父节点的名称,比如
jObject[“ATest”][“MyTest”][0]

AFAIK对于
JToken
/
jObject
,没有类似XPath的查询语法,但是您可以很容易地创建一个,请参见下面的代码

public static class StackOverflow_13033174
{
    public static void Test()
    {
        string json = @"{ 
                          ""Name"": ""Apple"", 
                          ""Expiry"": new Date(1230422400000), 
                          ""Price"": 3.99, 
                          ""ATest"": { 
                            ""MyTest"": 
                            [ 
                               ""blah"", 
                               ""blah"" 
                            ] 
                          } 
                        }";

        JObject jo = JObject.Parse(json);
        JToken myTest = jo.Descendants()
            .Where(t => t.Type == JTokenType.Property && ((JProperty)t).Name == "MyTest")
            .Select(p => ((JProperty)p).Value)
            .FirstOrDefault();
        Console.WriteLine(myTest);
    }
}

以下是另一种方法,使用:

见:


您的JSON无效。
size
是数组还是对象?您缺少一个
名称中的
。是,无效,抱歉。我刚刚纠正了它。这只是一个例子,实际的JSON并不重要。我只是在寻找一种方法,如果你使用
JObject.Parse
你可以使用内置的方法,在给定名称的任何级别上查找节点。对于所有在我的文章中有相同问题的读者,就像我一样:是的
.descands()
以递归方式返回所有子项。
JToken
/
JObject
-Json.NET实际上支持查询。见和<当然,code>JObject.subjects()
也会起作用。
using System;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System.Collections.Generic;
using System.Linq;

                
public static class StackOverflow_13033174
{
    public static void Main()
    {
    string json = @"{ 
                      ""Name"": ""Apple"", 
                      ""Expiry"": new Date(1230422400000), 
                      ""Price"": 3.99, 
                      ""ATest"": { 
                        ""MyTest"": 
                        [ 
                           ""blah"", 
                           ""blah"" 
                        ] 
                      } 
                    }";

    JObject jo = JObject.Parse(json);
    
    JToken myTest = jo.SelectToken("*.MyTest");
    Console.WriteLine(myTest);
    }
}