Java JsonPath функция «indexOf» выдает исключение: Аргументы функции: «indexOf» закрыты неправильно - PullRequest
0 голосов
/ 26 июня 2019

Я использую библиотеку Jayway JsonPath версии 2.4.0.Использование функции indexOf в jsonPath, например$.values[?(@.num.indexOf('101') != -1)].id

Это дает исключение Arguments to function: 'indexOf' are not closed properly. Но то же самое работает с онлайн-оценщиком jsonPath

Я пробовал ту же строку jsonPath & json на https://jsonpath.com. Там все работает нормально,Я пробовал несколько смешивать и сочетать (например, $.values[?(@.num.indexOf("101") != -1)].id) (двойные кавычки вместо одинарных), но все же.

public static void main(String[] args) {
        try {
        String jsonString ="{ \n" + 
                "   \"values\":[ \n" + 
                "      { \n" + 
                "         \"num\":[\"101\", \"102\"],\n" + 
                "         \"id\": \"a\"\n" + 
                "      },\n" + 
                "       { \n" + 
                "         \"num\":[\"104\", \"105\"],\n" + 
                "         \"id\": \"b\"\n" + 
                "      }\n" + 
                "   ]\n" + 
                "}";



        String jsonPath = "$.values[?(@.num.indexOf('101') != -1)].id";


        DocumentContext jsonContext = JsonPath.parse(jsonString);
        List<String> ans = null;
        ans = jsonContext.read(String.valueOf(jsonPath));
        System.out.println(ans);
        }catch(Exception e) {
            e.printStackTrace();
            System.out.println(e.getMessage());
        }
    }

Ожидаемый ответ - "a", но он дает исключение.Вот эта трассировка стека

SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
com.jayway.jsonpath.InvalidPathException: Arguments to function: 'indexOf' are not closed properly.
    at com.jayway.jsonpath.internal.path.PathCompiler.parseFunctionParameters(PathCompiler.java:375)
    at com.jayway.jsonpath.internal.path.PathCompiler.readPropertyOrFunctionToken(PathCompiler.java:217)
    at com.jayway.jsonpath.internal.path.PathCompiler.readNextToken(PathCompiler.java:151)
    at com.jayway.jsonpath.internal.path.PathCompiler.readDotToken(PathCompiler.java:171)
    at com.jayway.jsonpath.internal.path.PathCompiler.readNextToken(PathCompiler.java:145)
    at com.jayway.jsonpath.internal.path.PathCompiler.readPropertyOrFunctionToken(PathCompiler.java:237)
    at com.jayway.jsonpath.internal.path.PathCompiler.readNextToken(PathCompiler.java:151)
    at com.jayway.jsonpath.internal.path.PathCompiler.readDotToken(PathCompiler.java:171)
    at com.jayway.jsonpath.internal.path.PathCompiler.readNextToken(PathCompiler.java:145)
    at com.jayway.jsonpath.internal.path.PathCompiler.readContextToken(PathCompiler.java:124)
    at com.jayway.jsonpath.internal.path.PathCompiler.compile(PathCompiler.java:58)
    at com.jayway.jsonpath.internal.path.PathCompiler.compile(PathCompiler.java:75)
    at com.jayway.jsonpath.internal.filter.ValueNodes$PathNode.<init>(ValueNodes.java:580)
    at com.jayway.jsonpath.internal.filter.ValueNode.createPathNode(ValueNode.java:208)
    at com.jayway.jsonpath.internal.filter.FilterCompiler.readPath(FilterCompiler.java:364)
    at com.jayway.jsonpath.internal.filter.FilterCompiler.readValueNode(FilterCompiler.java:96)
    at com.jayway.jsonpath.internal.filter.FilterCompiler.readExpression(FilterCompiler.java:190)
    at com.jayway.jsonpath.internal.filter.FilterCompiler.readLogicalANDOperand(FilterCompiler.java:186)
    at com.jayway.jsonpath.internal.filter.FilterCompiler.readLogicalAND(FilterCompiler.java:150)
    at com.jayway.jsonpath.internal.filter.FilterCompiler.readLogicalOR(FilterCompiler.java:132)
    at com.jayway.jsonpath.internal.filter.FilterCompiler.readLogicalANDOperand(FilterCompiler.java:181)
    at com.jayway.jsonpath.internal.filter.FilterCompiler.readLogicalAND(FilterCompiler.java:150)
    at com.jayway.jsonpath.internal.filter.FilterCompiler.readLogicalOR(FilterCompiler.java:132)
    at com.jayway.jsonpath.internal.filter.FilterCompiler.compile(FilterCompiler.java:78)
    at com.jayway.jsonpath.internal.filter.FilterCompiler.compile(FilterCompiler.java:54)
    at com.jayway.jsonpath.internal.path.PathCompiler.readFilterToken(PathCompiler.java:461)
    at com.jayway.jsonpath.internal.path.PathCompiler.readNextToken(PathCompiler.java:141)
    at com.jayway.jsonpath.internal.path.PathCompiler.readPropertyOrFunctionToken(PathCompiler.java:237)
    at com.jayway.jsonpath.internal.path.PathCompiler.readNextToken(PathCompiler.java:151)
    at com.jayway.jsonpath.internal.path.PathCompiler.readDotToken(PathCompiler.java:171)
    at com.jayway.jsonpath.internal.path.PathCompiler.readNextToken(PathCompiler.java:145)
    at com.jayway.jsonpath.internal.path.PathCompiler.readContextToken(PathCompiler.java:124)
    at com.jayway.jsonpath.internal.path.PathCompiler.compile(PathCompiler.java:58)
    at com.jayway.jsonpath.internal.path.PathCompiler.compile(PathCompiler.java:75)
    at com.jayway.jsonpath.JsonPath.<init>(JsonPath.java:97)
    at com.jayway.jsonpath.JsonPath.compile(JsonPath.java:463)
    at com.jayway.jsonpath.internal.JsonContext.pathFromCache(JsonContext.java:222)
    at com.jayway.jsonpath.internal.JsonContext.read(JsonContext.java:78)
    at Init.main(Init.java:32)
Arguments to function: 'indexOf' are not closed properly.

1 Ответ

2 голосов
/ 26 июня 2019

Существует несколько реализаций JsonPath.Ваше выражение пути несовместимо с реализацией Jayway.Я думаю, что это ошибка в этой реализации.

Таким образом, вы можете либо переключать библиотеки, либо вы можете изменить свое выражение на то, что подходит для версии Jayway.Если вы измените свой путь к этому, ваш код должен дать ожидаемый результат:

String jsonPath = "$.values[?('101' in @.num)].id";
...