我正在使用带有JSonPath的camel - 依赖项将版本置于0.9.1
我正在尝试基于jsonpath
执行基于内容的路由 <choice>
<when>
<jsonpath>$.(?(@.headerKey == 'reports'))</jsonpath>
<to uri="direct:echoProcessorReports"/>
</when>
<otherwise>
<to uri="direct:echo"/>
</otherwise>
</choice>
将要测试的文档如下所示:
{"headerKey":"reports","data":[{"name":"reports0"},{"name":"reports1"},{"name":"reports2"},{"name":"reports3"},{"name":"reports4"}]}
我无法确定此语法。我直接使用jsonpath库尝试了各种组合:
import com.jayway.jsonpath.JsonPath;
import org.apache.camel.jsonpath.JsonPathEngine;
/**
* Created by mhampton on 1/29/15.
*/
public class CrapTest {
public static void main(String[] args) {
String data = "{" +
"\"headerKey\":\"reports\"," +
"\"data\":" +
"[{\"name\":\"reports0\"},{\"name\":\"reports1\"},{\"name\":\"reports2\"},{\"name\":\"reports3\"},{\"name\":\"reports4\"}]}";
JsonPath path = JsonPath.compile("$.");
Object result = path.read(data); //net.minidev.json.JSONObject
System.out.println(result);
path = JsonPath.compile("$.headerKey");
result = path.read(data);
System.out.println(result);
path = JsonPath.compile("$.headerKey(?@ == 'reports)");
result = path.read(data);
System.out.println(result);
path = JsonPath.compile("$(?(@.headerKey == 'reports'))");
result = path.read(data);
System.out.println(result);
path = JsonPath.compile("$.[*]");
result = path.read(data);
System.out.println(result);
}
}
我已经能够提取值(“$ .headerKey”),但我似乎无法让过滤器表达式适用于它。
非常感谢任何帮助。
答案 0 :(得分:0)
这可能是个错误,另请参阅JSONPath expression for checking string in Apache Camel XML。
作为解决方法,您可以使用:
<jsonpath>$..[?(@.headerKey == 'reports')]</jsonpath>
[]
是下标运算符(=数组运算符),..
代表递归下降。因此,表达式意味着:返回所有元素(而不仅仅是 top 元素),headerKey
等于'reports'
。