Ошибки разбора JSON в Java
Метод readValue ожидает синтаксически
корректный JSON и типы, которые можно присвоить
полям класса. Лишняя запятая, незакрытая скобка
или строка вместо числа приводят к исключению
из пакета Jackson.
Локальная строка с синтаксической ошибкой не должна ронять всю программу, если разбор только один из шагов обработки. Исключение перехватывают и печатают сообщение:
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.List;
public class Main {
public static void main(String[] args) {
String broken = "[\"a\", \"b\", \"c\",]";
ObjectMapper mapper = new ObjectMapper();
try {
List<String> items = mapper.readValue(
broken,
new TypeReference<List<String>>() {}
);
System.out.println("ok");
} catch (Exception ex) {
System.out.println(ex.getMessage());
}
}
}
Для списка без параметров типа в сигнатуре метода
используют TypeReference: так Jackson
сохраняет информацию о List<String>
на этапе выполнения.
Несовпадение схемы объекта тоже даёт ошибку. Если в тексте нет обязательного ключа для компонента record, разбор прервётся до создания экземпляра:
import com.fasterxml.jackson.databind.ObjectMapper;
public record Badge(String label, int level) {}
public class Main {
public static void main(String[] args) {
ObjectMapper mapper = new ObjectMapper();
try {
mapper.readValue("{\"label\":\"pro\"}", Badge.class);
} catch (Exception ex) {
System.out.println(ex.getClass().getSimpleName());
}
}
}
Перед разбором ответа сети имеет смысл проверить
код HTTP и только при успехе вызывать
readValue. HTML-страница ошибки в теле
ответа не превратится в ваш record и должна
обрабатываться отдельно.
Дан код:
String json = "[1, 2,";
Попытайтесь получить из неё список строк. Выведите результат или текст ошибки, не прерывая работу программы аварийно.
Дана строка JSON:
String raw = "{\"level\":1}";
Разберите эту строку как Badge
с двумя компонентами. Перехватите исключение
и выведите короткое имя класса ошибки.