我的JSON(简体)如下:
[
{"name" : "foobar",
"id" : 123
},
{"name" : "bar",
"id" : 123
},
{"name" : "foobar",
"id" : 456
}, ...
]
我正在使用https://jsonpath.herokuapp.com/来尝试找到正确的JSONPATH语法,以过滤出从foo
开始并具有id == 123的所有 not 。
获取它来过滤要做以foo
开头的内容很容易:
$..[?(@.name =~ /foo.*/i)]
这将产生以下结果:
[
{
"name" : "foobar",
"id" : 123
},
{
"name" : "foobar",
"id" : 456
}
]
我可以通过添加其他过滤器来消除ID 456,例如:
$..[?(@.name =~ /foo.*/i && @.id==123)]
但是,与以foo
开头的名称相反,我该怎么做?我希望所有不以foo
开头的实体。
我尝试过这样的事情:
$..[?(!@.name =~ /foo.*/i && @.id==123)]
至少将其解析为有效的JSONPATH,并且应该将过滤器取反,但是由于某种原因,它仍然很乐意仅报告foobar
条目:
[
{
"name" : "foobar",
"id" : 123
}
]
如何在JSONPATH中实现NOT LIKE
?
谢谢!
答案 0 :(得分:1)
正则表达式以识别不是以给定字符串foo
开头的数据:
^([^f]|f[^o]|fo[^o])
如果您的正则表达式引擎支持负前瞻,则减少为
^(?!foo)
请注意将允许的匹配位置限制为测试字符串开头的起始锚(^)。
答案 1 :(得分:0)
感谢@collapsar朝正确的方向推动我,因为解决它的关键在于正则表达式(但特别是使用JavaScript正则表达式语法,并将其与JSONPath语法合并)。
实际上最终能解决问题的方法是更仔细地阅读documentation for JASONPath。它指出:
=〜
匹配JavaScript正则表达式。例如,[?(@。description =〜/cat.*/i)]匹配描述以cat开头的项目(不区分大小写)。
注意:使用“就绪”的位置不支持! API 1.1。
到Javascript Regular Expression的链接包含以下内容:
[^ xyz]
否定或补充的字符集。也就是说,它匹配方括号中未包含的任何内容。您可以使用连字符指定字符范围。正常字符集中所有可用的内容也可以在这里使用。例如,[^ abc]与[^ a-c]相同。他们最初在“胸围”中匹配“ r”,在“印章”中匹配“ h”。
有效的结果表达式为:
$..[?(@.name =~ /[^foo].*/ && @.id == 123)]
结果:
[
{
"name" : "bar",
"id" : 123
}
]
(我在拥有的JSON有效负载中添加了附加的bar
和id
456,以再次检查过滤器是否也有效)。