- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 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"
(获取书店中类别与'fiction'匹配的所有书名的数组)。我需要能够将整个查询作为字符串传递,因此能够在查询时进行过滤非常有用。
不幸的是,我在使用此过滤器功能时遇到了一些问题。我希望我必须对 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" ]
} ]
}
}"
最佳答案
当您在查询中使用脚本表达式时(?(...)
部分),您需要提供一个ScriptEvaluator
方法来评估脚本。不幸的是,他们没有为 C# 版本提供默认实现。您需要提供该实现。
开箱即用,这不是要解决的最微不足道的问题,您需要编写一个解释器。您有几个选择:使用 CodeDOM 将脚本编译并执行为 C# 代码(或您喜欢的任何语言),使用 Roslyn 解析脚本并进行评估,任何可行的方法。
对于这种特殊情况,一个快速而肮脏的解决方案是在您的脚本评估器方法中执行类似的操作:
object EvaluateScript(string script, object value, string context)
{
if (script == "@.category == 'fiction'")
{
var obj = value as JObject;
return (string)obj["category"] == "fiction";
}
return null;
}
这是另一个利用 IronPython 评估脚本的解决方案。
public class IronPythonScriptEvaluator
{
private Lazy<ScriptEngine> engine = new Lazy<ScriptEngine>(() => Python.CreateEngine());
private ScriptEngine Engine { get { return engine.Value; } }
private const string ItemName = "_IronPythonScriptEvaluator_item";
public object EvaluateScript(string script, object value, string context)
{
var cleanScript = CleanupScript(script);
var scope = Engine.CreateScope();
scope.SetVariable(ItemName, value);
return Engine.Execute<bool>(cleanScript, scope);
}
private string CleanupScript(string script)
{
return Regex.Replace(script, @"@", ItemName);
}
}
关于c# - 在 C# 中将过滤器与 JsonPath 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17998614/
我想添加一个监视器来检测不健康的服务并在这种情况下发送警报。我公开了一个简单的 REST API - /healthy,它返回一个 JSON例如{“健康”:true}。 然后我向我的 site24x7
使用 JSONPath,如何从已知键列表中提取单个值? 例如,我想编写一个 JSON 路径表达式,可以从所有这三个 JSON 文档中提取 Sean: { "firstName": "Sean"} {
使用节点 JSONPath,如何从子节点值中获取父节点名称 { "store": { "book": [ { "id":"1", "author
使用ashphy json path evaluator ,以及以下 JSON: { "store": { "book": [ { "category": "reference",
JsonPath 是否支持 AND (&&) 运算符? 考虑以下 JsonPath 表达式: $.values[?(@.level=='First' && @.type == 'Sales')].se
我正在尝试使用 jsonPath 和 pick 函数来确定是否需要根据当前域运行规则。我正在做的事情的简化版本在这里: global { dataset shopscotchMerch
我正在尝试在 Nifi 中使用 EvaluateJsonPath 处理器,但在使用 jayway jsonpath 语法时遇到了问题。我的对象如下所示: {"text":"my stuff", "ta
我有一个实现问题... #!/usr/bin/python #This is the API for BTC price request. # Average all the amounts, and
我正在使用放心框架,并且在它内部,它有 JsonPath 类。JsonPath 的方法签名为 getList(String path, Class T); 我尝试做这样的事情: List myList
我有这个“内容”响应,我需要从中断言一些值。 WebTestClient.BodyContentSpec content = response.expectStatus().isOk()
我正在读取一个文件,其中 Json 数据可用。我需要创建一个方法,它需要 jsonobject、jsonpath、type我需要检查 jsonpath 的数据类型,输入...如果数据类型相同,则应返回
我在使用 Stefan Goessner 的 JsonPath 查找数组或列表大小时遇到问题。我使用的是 json-path-2.0.0 版本。 我的 jsonpath 表达式是 $.orders
由于与我正在从事的项目相关的原因,我希望将对 JSON 文件的整个查询保存为一个字符串,例如,$.store.book[*].title(而不是必须将文档的每个级别临时存储为单独的对象)。 我目前正在
我正在尝试使用 Spring Boot Test 为 rest 端点编写单元测试,但是当我尝试使用 jsonPath 对 json 响应中的对象进行断言时,即使在以下情况下也会抛出 Assertion
我安装了 jsonpath-rw 1.4.0 sudo apt-get install python-jsonpath-rw 它带有一个 /usr/bin/jsonpath。但这在使用过滤器表达式时给
我有AWS步骤机,并且其中一个步骤用于使用SNS服务通知失败。我想从input json中选择一些元数据到传出消息中。所以我试图用jsonpath连接常量字符串,如下所示 "Notify Failur
我有如下的json字符串 [ { "topic": "inputTopic", "key": "0", "message": "test",
有没有办法通过过滤以下 json 中的“d”来提取“a”值? [ { "a":1, "b":{ "c":11,"d":12 } }, { "a":2, "b
我发现理解如何编写一个 jsonpath 来告诉我该字段中是否存在某些值有点困难。 例如:考虑这个 json: { "firstName": "John", "lastName" : "doe
我有一种情况,我有一个 json 字符串,它有一个子元素作为只包含字符串的数组。有没有办法获取包含特定字符串的数组的对象引用。 例子: { "Books":{ "History":[
我是一名优秀的程序员,十分优秀!