Jayway Jsonpath语法用于字符串数组过滤?

3

我正在尝试使用Nifi中的EvaluateJsonPath处理器,但是在jayway jsonpath语法方面遇到了麻烦。 我的对象看起来像下面这样:

{"text":"my stuff", "tags":["abc", "xyz", "beq"]}

我想按照标签路由消息 - 我希望包含 "xyz" 的所有内容都被路由到一条路径,并将不含它的所有内容路由到另一条路径。 使用http://jsonpath.herokuapp.com/,我一直在测试并试图找出基于包含字符串匹配的json对象进行过滤的语法。我可以基于明显的索引匹配(因此$.[?(@.tags[1] =~ /xyz/i)]完全可行),但我无法保证标记字段中对象的顺序或数量。 在Jayway JSON模块中有没有办法做到这一点?我看到了根据JSONPATH中数组中的字符串过滤Json,我已经尝试过了,但似乎在上面的模拟器中不起作用。
1个回答

3
我不知道如何在一个EvaluateJsonPath处理器步骤中完成此操作。但是可以通过两个步骤来实现:
  1. 使用EvaluateJsonPath将"xyz"标签从tags数组中过滤出来,使用类似于$.tags[?(@ =~ /xyz/i)]的JsonPath表达式,并将处理器的返回类型设置为json,以便返回一个数组。这将导致匹配时返回["xyz"],不匹配时返回[]
  2. 使用RouteOnAttribute根据结果数组进行路由,使用类似于${matchingTags:toLower():contains('xyz')}的表达式。
也可以考虑将JSON作为文本与正则表达式匹配。

肯定越来越接近了 - 我是一个nifi新手,所以我在理解整个流程的影响方面有一些困难。当我设置EvaluateJsonPath来过滤标签时,我可以验证我得到的数组要么为空,要么包含我正在寻找的标签。然后我将“匹配”流入RouteOnAttribute,但它只是单个数组,其中包含我的标签或为空 - 我希望在确定标签存在后将整个流文件(整个JSON对象)路由到适当的处理器? - Josh Harrison
玩了一会儿,我意识到我的“目标”设置为“flowfile-content”,而不是“flowfile-attribute”。现在看起来我们的路由正常了!谢谢! - Josh Harrison

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接