【问题标题】:Look Up any node in Json.NET在 Json.NET 中查找任何节点
【发布时间】:2012-10-23 14:48:42
【问题描述】:

我正在使用 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 中缺少"
  • 是的,它无效,抱歉。我刚刚纠正了它。这只是一个例子,实际的 JSON 并不重要。我只是在寻找一种方法来在给定名称的任何级别查找节点

标签: .net json json.net


【解决方案1】:

据我所知,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】:

这是使用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);
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    • 1970-01-01
    • 2016-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-14
    相关资源
    最近更新 更多