【问题标题】:Jayway Jsonpath syntax for string array filter?字符串数组过滤器的 Jayway Jsonpath 语法?
【发布时间】:2016-01-19 19:27:30
【问题描述】:

我正在尝试在 Nifi 中使用 EvaluateJsonPath 处理器,但在使用 jayway jsonpath 语法时遇到了问题。 我的对象如下所示:

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

我想根据标签路由消息 - 我希望包含“xyz”的所有内容都以一种方式路由,而不包含它的所有内容都以另一种方式路由。 使用 http://jsonpath.herokuapp.com/ 我一直在测试并试图找出基于包含匹配字符串数组的 json 对象进行过滤的语法。我可以根据公开索引进行匹配(所以$.[?(@.tags[1] =~ /xyz/i)] 工作得很好),但我不能保证标签字段中对象的顺序或数量。

有没有办法在 jayway json 模块中做到这一点?我看到了我尝试过的filter the Json according to string in an array in JSONPATH,但它似乎在上面的模拟器中不起作用。

【问题讨论】:

    标签: jsonpath apache-nifi


    【解决方案1】:

    我不知道如何在一个 EvaluateJsonPath 处理器步骤中执行此操作。但它当然可以分两步完成:

    1. 使用 EvaluateJsonPath 从标签数组中过滤“xyz”标签,使用 JsonPath 表达式(如 $.tags[?(@ =~ /xyz/i)])并将处理器 return-type 设置为 json,以便可以返回一个数组。这将导致 ["xyz"] 用于匹配文件,[] 用于不匹配文件
    2. 使用 RouteOnAttribute 根据结果数组进行路由,表达式类似于 ${matchingTags:toLower():contains('xyz')}

    可能还值得考虑将 JSON 作为文本与正则表达式进行比较以匹配标记。

    【讨论】:

    • 肯定越来越近了 - 我是一个 nifi 新手,所以我很难理解全流程的含义。当我设置 EvaluateJsonPath 来过滤标签时,我可以验证我得到的数组是空的还是包含我正在寻找的标签。然后我将“匹配”流入 RouteOnAttribute,但它只是一个空数组或包含我的标签的单个数组 - 我希望在确定标签存在后将整个流文件(整个 JSON 对象)路由到适当的处理器?
    • 玩了一会儿,我意识到我将“目标”设置为“流文件内容”而不是“流文件属性”。看起来我们现在正在正确路由!谢谢!
    猜你喜欢
    • 1970-01-01
    • 2022-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-20
    • 1970-01-01
    • 2015-06-09
    相关资源
    最近更新 更多