Длина массива Java JsonPath

У меня такой Json:

{
    "hello": {
        "hello": [
            {
                "wwrjgn": "aerg",
                "aaa": "gggg",
                "rfshs": {
                    "segse": "segsegs",
                    "xx": "rgwgwgw",
                    "x-e ": "eergye"
                },
                "egg": "sgsese",
                "segess": "sgeses",
                "segess": "segess"
            },
            {
                "esges": "segesse",
                "segesg": "ws",
                "rddgdr": {
                    "rdrdrdg": “srgsesees"
                },
                "drr": 3600,
                "esese": "uytk",
                "wew": "699",
                "eses": “qe4ty"
            }
        ],
        "how": www"
    }
}

Я делаю следующее:

Object document = 
Configuration.defaultConfiguration().addOptions().jsonProvider()
            .parse(ka.toJSONString());
int queries = JsonPath.read(document, "$..hello.length()");

    System.out.println("THE LENGTH OF THE NUMBER OF QUERIES " + queries);

Я получил:

nested exception is java.lang.ClassCastException: net.minidev.json.JSONArray 
cannot be cast to java.base/java.lang.Integer] with root cause
java.lang.ClassCastException: net.minidev.json.JSONArray cannot be cast to 
java.base/java.lang.Integer

Попробуйте здесь: http://jsonpath.herokuapp.com/?path= $ .. hello.length () я получаю:

[
   2,
   2
]

Это то, что мне нужно.

Есть идеи, что я делаю не так? Заранее спасибо.


person user6671584    schedule 06.04.2018    source источник
comment
В порядке исключения говорят: вы используете несовместимые типы. Вы не можете преобразовать JSONArray (который, похоже, является результатом метода JsonPath.read(...)) в Integer.   -  person Turing85    schedule 06.04.2018
comment
@ Turing85 Когда я использую JSONArray = вместо int =, я получаю: java.lang.ClassCastException: net.minidev.json.JSONArray не может быть преобразован в org.json.simple.JSONArray   -  person user6671584    schedule 06.04.2018
comment
Попробуйте List ‹String› или List ‹Integer› в качестве возвращаемого значения   -  person Guts    schedule 06.04.2018
comment
Что ж ... этого можно ожидать, если вы используете два разных JSONArray класса.   -  person Turing85    schedule 06.04.2018
comment
@Guts теперь у меня нет исключений, но для обоих случаев я получаю: ДЛИНА КОЛИЧЕСТВА ЗАПРОСОВ []   -  person user6671584    schedule 06.04.2018
comment
то есть сейчас он в основном не генерирует исключение, но все еще не работает :(   -  person user6671584    schedule 06.04.2018
comment
Вы проверяли ценность документа? Может что-то не так с парсингом json.   -  person Guts    schedule 06.04.2018


Ответы (1)


Этот ...

JsonPath.read(document, "$..hello.length()")

... передаст свой ответ экземпляру net.minidev.json.JSONArray, который не может быть преобразован в int. Это объясняет ClassCastException

Причина, по которой вы видите ...

[
   2,
   2
]

... при попытке онлайн-вычислителя заключается в том, что это toString() для экземпляра JSONArray, который возвращает эту строку.

Чтобы получить «ДЛИНУ ЧИСЛА ЗАПРОСОВ» в коде, просто прочтите вывод JsonPath как JSONArray, а затем получите атрибут размера этого типа. Например:

JSONArray read = JsonPath.read(document, "$..hello.length()");
// prints:
//    THE LENGTH OF THE NUMBER OF QUERIES 2
System.out.println("THE LENGTH OF THE NUMBER OF QUERIES " + read.size());

Вы также можете вернуть List<Integer, например:

List<Integer> read = JsonPath.read(document, "$..hello.length()");
// prints:
//    THE LENGTH OF THE NUMBER OF QUERIES 2
System.out.println("THE LENGTH OF THE NUMBER OF QUERIES " + read.size());
person glytching    schedule 06.04.2018
comment
Ваш ответ семантически верен, но, похоже, существует культ: OP, похоже, импортирует другой класс JSONArray (org.json.simple.JSONArray). В этом случае вы можете использовать полное доменное имя (подробности см. В разделе комментариев к вопросу). - person Turing85; 06.04.2018
comment
Я получаю следующее исключение: SEVERE: Servlet.service () для сервлета [dispatcherServlet] в контексте с path [] сгенерировал исключение [Ошибка обработки запроса; вложенное исключение - это java.lang.ClassCastException: net.minidev.json.JSONArray не может быть преобразован в org.json.simple.JSONArray] с основной причиной java.lang.ClassCastException: net.minidev.json.JSONArray не может быть преобразован в org. json.simple.JSONArray - person user6671584; 06.04.2018
comment
Исключение генерируется в JSONArray read = JsonPath.read (документ, $ .. hello.length ()); - person user6671584; 06.04.2018
comment
@ Turing85 Я использовал jsonpath раньше для фактического анализа и чтения, и они работают ... это просто длина массива, которая не работает ... Не уверен, что это имеет значение, хотя - person user6671584; 06.04.2018
comment
@ user6671584 Я обновил ответ, чтобы устранить путаницу между типами JSONArray. Как сказал @ Turing85, вы можете использовать полное доменное имя (net.minidev.json.JSONArray) или просто использовать List<Integer>, как я показал в моем последнем обновлении. - person glytching; 06.04.2018
comment
@glytching да, и я пробовал оба ... (я предпочитаю не менять полное доменное имя), но оба дают ДЛИНУ КОЛИЧЕСТВА ЗАПРОСОВ 0 :( - person user6671584; 06.04.2018
comment
@ user6671584 Я взял код из вашего вопроса и запустил его локально - с модификацией, показанной в моем ответе - и он дал желаемый результат, поэтому похоже, что ваш вопрос не является MCVE. - person glytching; 06.04.2018
comment
@glytching your List Решение ‹Integer› правильное .. Я тупой, при чтении документа делал еще что-то не так, как подсказал Гуц. Спасибо вам обоим. - person user6671584; 06.04.2018