查找Json.NET中的任何节点

10
我正在使用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]


你的JSON无效。Sizes是一个数组还是一个对象?而且在Name中你缺少了一个引号。 - Paolo Moretti
是的,它是无效的,非常抱歉。我刚刚修正了它。那只是一个例子,实际的 JSON 并不重要。我只是在寻找一种根据名称找到任意层级节点的方法。 - Alex
2个回答

21
据我所知,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);
    }
}

2
如果您使用JObject.Parse,则可以使用内置的JContainer.Descendants方法。 - Paolo Moretti
1
对于所有和我有同样疑问的读者:是的,.Descendants()会递归地返回所有子元素。 - Dejan
据我所知,JToken / JObject 没有类似于 XPath 的查询语法 - 实际上,Json.NET 支持 [tag:jsonpath] 查询。请参见 What is the JSON.NET equivalent of XML's XPath, SelectNodes, SelectSingleNode?How do I get a deeply-nested property from JSON string?。当然,JObject.Descendants() 也可以使用。 - dbc

5

以下是使用JSONPath的另一种方法:

参见:https://dotnetfiddle.net/EIKjnH

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);
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接