Тест JsonPath для значения верхнего уровня

Я использую верблюд с JSonPath - зависимость устанавливает версию 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"), но я не могу заставить выражение фильтра работать для него.

Любая помощь очень ценится.


person hammer    schedule 29.01.2015    source источник


Ответы (1)


Это может быть ошибка, см. также выражение JSONPath для проверки строки в Apache Camel XML.

В качестве обходного пути вы можете использовать:

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

[] — это оператор индекса (= оператор массива), а .. — рекурсивный спуск. Итак, выражение означает: вернуть все элементы (а не только элемент top) с headerKey равным 'reports'.

person Peter Keller    schedule 30.01.2015