我正在使用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]
这样的父级名称?
答案 0 :(得分:15)
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);
}
}
答案 1 :(得分:1)
这是使用JPATH的另一种方法:
请参阅: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);
}
}