Синтаксический анализ Java JSON

#java #json #maven #intellij-idea

#java #json #maven #intellij-идея

Вопрос:

Я столкнулся с проблемой, когда работал с проектом, затем переключился на другой и через некоторое время вернулся к первому проекту.

Странная вещь здесь заключается в том, что после возвращения к старому проекту почему-то синтаксический анализ JSON больше не работает так, как раньше.

Это проект maven, и все зависимости такие же, как и раньше.

Итак, что происходит, так это то, что, например, мой IntelliJ больше не распознает URL-адреса, изображение с консоли раньше:

там

и теперь:

там

Как вы можете видеть, URL-адреса были синими и интерактивными, теперь в виде обычного текста.

Кроме того, при разборе массива JSON я ранее мог сделать что-то подобное:

 number = jsonArray.getJSONObject(0).getString("version");
  

И он вернул бы строку, но сейчас происходит то, что я получаю сообщение об ошибке:

 INFO: org.json.JSONException: JSONObject["version"] not a string.
  

Я использую этот импорт:

 import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
  

Я знаю, что сейчас это может показаться довольно расплывчатым, но не стесняйтесь задавать дополнительные вопросы.

Редактировать: строка в JSON:

 version: 36928,
  

Комментарии:

1. Похоже, структура JSON изменилась, если вы опубликуете пример обработанного JSON, вам будет легче помочь.

2. Дело в том, что другой разработчик все еще работает над тем же проектом и на его компьютере — все работает. Строка, которая выдает ошибку в JSON, выглядит следующим образом: версия: 36928,

3. "36928" является строкой, 36928 является числом. Попробуйте с помощью getInt(«version») получить числовое значение

4. @AxelH Спасибо, мы уже пробовали это, и это работает, но это означает, что нам нужно будет реорганизовать большую часть нашего кода. В настоящее время мы пытаемся выяснить, что отличается в настройках или что с этим связано, потому что тот же код работает на другом компьютере.

5. Тот же код, та же версия библиотеки, тот же JSON? Ну, я могу заверить вас, что один из них отличается. Вы можете запустить diff для обоих проектов, чтобы сравнить их. Но среда IDE не несет ответственности за время выполнения. Это отличается для URL.

Ответ №1:

Что отличалось, так это версия JDK и разрядный режим. У меня был установлен немного более новый JDK и 64-разрядный, на другом КОМПЬЮТЕРЕ был более старый JDK и 32-разрядный. Я не совсем уверен, что в них отличается и вызвало проблему, но теперь она снова работает.

Спасибо вам всем!

Ответ №2:

Попробуйте использовать Jackson ArrayNode и ObjectNode вместо JSONArray и JSONObject.

 ObjectMapper mapper = new ObjectMapper();
ArrayNode arrayNode = mapper.createArrayNode();
Object obj = new Object();
arrayNode.add(mapper.createObjectNode().put("version", "Hello Stack!"));
arrayNode.addPOJO(obj);
arrayNode.get(0).get("version");
  

А также лучше использовать эту зависимость Maven для включения jackson:

 <dependency>
        <groupId>com.fasterxml.jackson.datatype</groupId>
        <artifactId>jackson-datatype-jsr310</artifactId>
        <version>${jackson.version}</version>
</dependency>
  

Документ находится здесь: http://fasterxml.github.io/jackson-databind/javadoc/2.0.0/com/fasterxml/jackson/databind/node/ArrayNode.html

Комментарии:

1. Зачем менять библиотеку, если первая работает нормально? Проблема заключалась в изменении поведения в рабочем коде. Это требует большого обновления…