ClassCastException при попытке проанализировать JSONArray - PullRequest
2 голосов
/ 16 марта 2019

При попытке проанализировать следующую строку JSON с помощью библиотеки json.simple :

[
    {"id" : "6d7662a9.f8ba04"},
    {"id" : "2da98cc2.145ba4"},
    {"id" : "45492640.a17d68"}
]

я получаю следующее исключение:

java.lang.ClassCastException: org.json.simple.JSONArray cannot be cast to org.json.simple.JSONArray

Вот какЯ делаю это:

JSONArray json = (JSONArray) new JSONParser().parse(jsonString);

Строка JSON является массивом, поэтому не уверен, почему выбрасывается это исключение.

Здесь есть несколько похожих вопросов, но в своих случаях они пыталисьдля приведения JSONObject к JSONArray, поэтому имеет смысл сгенерировать исключение, но в этом случае оно выглядит правильно.

-----------------EDITS -----------------

Я добавил строку для печати класса объекта, например:

Object json = new JSONParser().parse(jsonString);
System.out.println(json.getClass());

Это печатает следующую строку:

class org.json.simple.JSONArray

и в следующей строке, у меня есть это, если:

if(json instanceof JSONArray) {
    System.out.println("This is a JSONArray");
}

Но это не доступ к if, так что это действительно странно, потому чтоСначала я проверяю, является ли объект JSONArray, но он не печатает "This is a JSONArray"

Ответы [ 2 ]

6 голосов
/ 16 марта 2019

Вы говорите, что получаете это:

java.lang.ClassCastException: org.json.simple.JSONArray cannot be cast 
    to org.json.simple.JSONArray

Обратите внимание, что полностью определенные имена классов выглядят одинаково. Если это сообщение было записано точно, а имена идентичны 1 , это означает, что в вашу JVM загружены две версии класса JSONArray!

Это возможно в JVM, где приложение или инфраструктура имеют несколько загрузчиков классов, и вам удалось загрузить класс в более чем один загрузчик классов. Например, это может произойти, если у вас есть JAR-файл библиотеки JSON ОБА в каталоге общей библиотеки веб-контейнера И в файле WAR веб-приложения.

Дело в том, что тип времени выполнения класса определяется классами FQN и загрузчиком классов. Два класса с одинаковым FQN, загруженным в разные загрузчики классов, являются разными типами, даже если байтовые коды идентичны. Это означает, что они не совместимы с присвоением, и это приводит к странным (но правильным!) Сбоям приведения классов.

Решение:

  1. Просмотрите дерево файлов веб-контейнера на вашей платформе выполнения, чтобы найти несколько копий файла JSON JAR.
  2. Удалите проблемные копии из общей папки lib или из всех файлов WAR.

1 - Действительно неясное альтернативное объяснение состоит в том, что имена выглядят одинаково из-за «гомоглифов», но на самом деле они разные. Но в этом контексте, я думаю, мы можем игнорировать это объяснение как неправдоподобное.

0 голосов
/ 16 марта 2019

должно быть как

    Object obj = new JSONParser().parse(jsonString);
    JSONArray json = new JSONArray();
json.add(obj);
...