10

.NETアプリでJSONファイルを解析するためにNewtonSoftJson.NETライブラリを使用しています。私がする必要があるのは、ノードの名前を渡し、ノードが存在する場合は、そのレベルが事前に不明であるかどうかに関係なく、ノードを取得することです。

たとえば、ファイル内:

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

"MyTest"のように親の名前を知らなくても、値を使用してそのノードをフェッチする方法はありjObject["ATest"]["MyTest"][0]ますか?

4

2 に答える 2

21

AFAIKにはJToken/のXPathのようなクエリ構文はありJObjectませんが、かなり簡単に作成できます。以下のコードを参照してください。

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);
    }
}
于 2012-10-23T16:08:19.147 に答える
4

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);
    }
}
于 2019-09-24T16:33:50.553 に答える