我正在尝试使用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文件中获取所有三个对象。
如果不是商家=='Telefora',我使用merchantID == 16,那么效果很好。我认为jsonPath也可以匹配字符串。虽然上面的例子没有搜索json的merchantDomain部分,但我遇到了同样的问题。
答案 0 :(得分:5)
您的问题来自如the documentation中所述,字符串相等运算符为eq
,neq
和like
。 ==
仅适用于数字。在您的情况下,您要测试一个字符串是否等于另一个字符串,这是eq
字符串相等运算符的作用。
只需在您的JSON路径过滤器表达式中将==
替换为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) { }
|>;
}
}
}