使用jsonPath查找字符串



我试图使用jsonPath和pick函数来确定是否需要基于当前域运行规则。我所做的事情的简化版本如下:

    global 
{
    dataset shopscotchMerchants <- "https://s3.amazonaws.com/app-files/dev/merchantJson.json" cachable for 2 seconds
}
rule checkdataset is active
{
    select when pageview ".*" setting ()
    pre
    {
        merchantData = shopscotchMerchants.pick("$.merchants[?(@.merchant=='Telefora')]");
    }
    emit 
    <|
        console.log(merchantData);
    |>
}

我期望的控制台输出是telefora对象,而不是从json文件中获得所有三个对象。

如果我用merchantID==16代替merchant=='Telefora',那么效果会很好。我认为jsonPath也可以对字符串进行匹配。虽然上面的例子没有针对json的merchantDomain部分进行搜索,但我遇到了同样的问题。

您的问题来自这样一个事实,如文档中所述,字符串相等操作符是eq, neqlike==只表示数字。在您的示例中,您想要测试一个字符串是否等于另一个字符串,这是eq字符串相等操作符的工作。

只需将JSONpath过滤器表达式中的==替换为eq,就可以了:

    global 
{
    dataset shopscotchMerchants <- "https://s3.amazonaws.com/app-files/dev/merchantJson.json" cachable for 2 seconds
}
rule checkdataset is active
{
    select when pageview ".*" setting ()
    pre
    {
        merchantData = shopscotchMerchants.pick("$.merchants[?(@.merchant eq 'Telefora')]"); // replace == with eq
    }
    emit 
    <|
        console.log(merchantData);
    |>
}

我在自己的测试规则集中对其进行了测试,其源代码如下:

ruleset a369x175 {
  meta {
    name "test-json-filtering"
    description <<
    >>
    author "AKO"
    logging on
  }
  dispatch {
      domain "exampley.com"
  }
  global {
    dataset merchant_dataset <- "https://s3.amazonaws.com/app-files/dev/merchantJson.json" cachable for 2 seconds
  }
  rule filter_some_delicous_json {
    select when pageview "exampley.com"
    pre {
        merchant_data = merchant_dataset.pick("$.merchants[?(@.merchant eq 'Telefora')]");
    }
    {
        emit <|
            try { console.log(merchant_data); } catch(e) { }
        |>;
    }
  }
}

相关内容

  • 没有找到相关文章

最新更新