JSonPath测试顶级值

时间:2015-01-29 23:23:42

标签: json apache-camel jsonpath

我正在使用带有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”),但我似乎无法让过滤器表达式适用于它。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

这可能是个错误,另请参阅JSONPath expression for checking string in Apache Camel XML

作为解决方法,您可以使用:

<jsonpath>$..[?(@.headerKey == 'reports')]</jsonpath>

[]是下标运算符(=数组运算符),..代表递归下降。因此,表达式意味着:返回所有元素(而不仅仅是 top 元素),headerKey等于'reports'