如何在JsonPath.net中结合search()函数与其他布尔条件过滤JSON数组?
解决方案
针对你使用System.Text.Json.Nodes + JsonPath.NET的场景,要实现多条件组合过滤,只需将两个条件通过**逻辑与运算符&&**组合在JSON Path的过滤表达式中即可。以下是具体实现方式:
正确的JSON Path表达式
$[?(search(@["TO Axis"][0].value, "^(Z|MX)$") && @["Action"][0].value in ["Home", "Move"])]
表达式拆解
search(@["TO Axis"][0].value, "^(Z|MX)$"):调用JsonPath.NET的search()正则匹配函数,验证"TO Axis"数组第一个元素的value是否完全匹配Z或MX(正则^(Z|MX)$确保精确匹配)@["Action"][0].value in ["Home", "Move"]:使用in运算符,验证"Action"数组第一个元素的value是Home或Move中的任意一个&&:逻辑与运算符,确保两个条件同时满足
C#代码示例
using System.Text.Json.Nodes; using JsonPath.Net; // 示例JSON数组 string json = @"[ { ""TO Axis"": [{ ""value"": ""Z"" }], ""Action"": [{ ""value"": ""Home"" }] }, { ""TO Axis"": [{ ""value"": ""MX"" }], ""Action"": [{ ""value"": ""Move"" }] }, { ""TO Axis"": [{ ""value"": ""X"" }], ""Action"": [{ ""value"": ""Home"" }] }, { ""TO Axis"": [{ ""value"": ""Z"" }], ""Action"": [{ ""value"": ""Stop"" }] } ]"; // 加载为JsonNode JsonNode root = JsonNode.Parse(json)!; // 执行JSON Path查询 JsonNode[] results = JsonPath.Query(root, @"$[?(search(@[""TO Axis""][0].value, ""^(Z|MX)$"") && @[""Action""][0].value in [""Home"", ""Move""])") .OfType<JsonNode>() .ToArray(); // 输出匹配结果 foreach (var node in results) { Console.WriteLine(node.ToJsonString()); }
关键注意事项
- 带空格的属性名必须用
@["属性名"]的形式访问,不能直接写@.TO Axis - 正则表达式需用
^和$锚定,避免部分匹配导致的结果偏差 - 多条件组合时,所有条件需包裹在
[?(...)]的过滤括号内,用逻辑运算符(&&/||)连接
内容的提问来源于stack exchange,提问作者Cliff Pennalligen
相关产品推荐
相关产品推荐

