【发布时间】:2013-08-01 15:42:32
【问题描述】:
我正在使用JsonPath for C# 来查询一些 JSON 数据。 JsonPath 没有自带解析器,因此根据Rick Sladkey's advice,我使用Json.NET 将我的Json 字符串解析为嵌套IDictionary 对象、IList 数组和原语的集合。然后我使用JsonPath对其进行过滤(在添加Rick Sladkey's answer中建议的类之后)。
作为参考,这是我的代码中实际处理所有这些的部分:
// string exampleJsonString defined below
string query = "$.store.book[*].title" // we should get a list of all titles
// step 1: use Json.NET to parse the json string into a JObject
JObject parsedJson = JObject.Parse(exampleJsonString);
// step 2: use JsonPath with a custom ValueSystem (JsonNetValueSystem)
JsonPathContext context = new JsonPathContext
{ ValueSystem = new JsonNetValueSystem() };
// step 3: get results using JsonPath
List<object> toRet = context.SelectNodes(parsedJson,
query).Select(node => node.Value).ToList();
我首先使用 JsonPath 的原因是它的过滤器功能。你不仅可以像"$.store.book[*].title"这样的普通查询(获取书店中所有书名的数组),还可以像"$.store.book[?(@.category == 'fiction')].title"这样的查询(获取书店中所有类别匹配“小说”的书名的数组')。我需要能够将整个查询作为字符串传递,因此能够在查询时进行过滤非常有帮助。
很遗憾,我在使用此过滤器功能时遇到了一些问题。我希望我必须对 JsonNetValueSystem 类(最初在 the aforementioned stack overflow answer 中定义)或 JsonPath 命名空间(您可以从 JsonPath's google code page 获取 JsonPath.cs)进行调整。如果有一些外部工具或 Json.NET 的替代解析机制可以让我保持 JsonPath 的过滤而不必编写太多额外的代码,那将是理想的,但我很确定我将不得不改变 JsonNetValueSystem或 JsonPath 本身。 (这两个都相当容易更改,因为它们只是 .cs 文件,但如果没有更多工作,我无法真正深入研究 Json.NET。)
我实际上似乎无法弄清楚原始 JsonPath 代码在哪里处理过滤,也无法弄清楚为什么 JsonNetValueSystem 类会剥夺它的功能。任何有关如何在查询字符串中添加过滤功能的建议将不胜感激。即使只是“不要乱用 JsonPath,只需更改 JsonNetValueSystem”,反之亦然。
string exampleJsonString = "{
"store": {
"book": [ {
"category": "reference",
"author": "Nigel Rees",
"title": "Sayings of the Century",
"price": 8.95
}, {
"category": "fiction",
"author": "Evelyn Waugh",
"title": "Sword of Honour",
"price": 12.99
}, {
"category": "fiction",
"author": "Herman Melville",
"title": "Moby Dick",
"isbn": "0-553-21311-3",
"price": 8.99
}, {
"category": "fiction",
"author": "J. R. R. Tolkien",
"title": "The Lord of the Rings",
"isbn": "0-395-19395-8",
"price": 22.99
} ],
"bicycle": [ {
"color": "red",
"price": 19.95,
"style": [ "city", "hybrid" ]
}, {
"color": "blue",
"price": 59.91,
"style": [ "downhill", "freeride" ]
} ]
}
}"
【问题讨论】:
-
您是否尝试过将 JSON 解析为类对象并使用 Linq 进行过滤?
-
问题是,我不会事先知道JSON的结构是什么。例如,我无法设置具有 Category、Author、Title 和 Price 的 Book 类,因为该代码旨在用于各种各样的数据库,其中大多数都没有 Book 对象。所以我基本上每次都将字符串解析为新的 JObject 。我不知道为每个新数据库创建自定义类的方法。有吗?如果是这样,那就太棒了。如果不是,我想我仍然坚持我所拥有的,据我所知。我不太了解 Linq,所以如果有办法,那就太好了。
-
无法理解。我仍在尝试自己弄清楚 Linq。但似乎 JSON.Net 可能会提供(通过一些工作)您正在寻找的东西。我建议从这里查看文档:james.newtonking.com/projects/json/help/index.html?topic=html/… 可能需要您利用 JArray 和 IObject 方法才能到达您需要的位置。