#java #json #spring-boot #jackson #json-deserialization
#java #json #весенняя загрузка #джексон #json-десериализация
Вопрос:
Я пытаюсь десериализовать этот json в класс POJO, чтобы тогда я мог управлять объектами. JSON:
{
"something": "x",
"items": [
{
"type": "y",
"id": "123",
"otherInfo": {
"tag": "abc",
"otherId": [
{
"first": "qaz",
"second": "zaq"
},
{
[...]
Существует более 10 элементов, подобных этому.
Я хотел десериализовать его, поэтому я использовал jsonschema2pojo, создал такие классы, как Item и otherInfo, с геттерами, установщиками и конструкторами.
Затем я создал ObjectMapper в моем классе DAO:
ObjectMapper mapper = new ObjectMapper();
Item items;
{
try {
items = mapper.readValue(new File("path/file.json"), Item.class);
} catch (IOException e) {
e.printStackTrace();
}
}
public Item getAllItems(){
return items;
}
Таким образом, я получаю пустой вывод.
При изменении элемента на Item[] я получаю «Исключение MismatchedInputException» из-за «чего-то», которое находится над «элементами» в моем JSON.
Когда я попытался обратиться к классу POJO, который находится на один уровень выше элемента, я получил весь JSON в виде одного элемента массива со всем, что находится внутри него. Это очевидно, но это показывает, что ObjectMapper работает корректно.
Существует ли какой-либо простой или эффективный способ десериализации JSON, подобный этому?
Комментарии:
1. Зачем note создавать еще один родительский класс с атрибутом «Something» И списком элементов, а затем пытаться десериализовать этот родительский объект?
2. Спасибо за ваш ответ. Возможно, это вариант. Не могли бы вы предоставить более подробную информацию о десериализации родительского объекта? Я не думаю, что полностью понимаю, что вы имеете в виду. Кстати. нет ли способа «пропустить» «что-то» и просто десериализовать все элементы? Редактировать: На самом деле, это даже не работает с полностью удаленным «чем-то»…
Ответ №1:
Вы можете создать родительский объект, который содержит ArrayList для представления массива элементов.
Например:
public class MyParentObject {
String something;
ArrayList<Item> items;
public ArrayList<Item> getItems() {
return items;
}
// the rest of your getters/setters
}
// the object mapper line becomes:
MyParentObject parentObject = mapper.readValue(new File("path/file.json"), MyParentObject.class);
ArrayList<Item> items = parentObject.getItems();
С помощью десериализации JSON массивы JSON могут быть напрямую сопоставлены с ArrayList.
Комментарии:
1. Спасибо за ваш ответ. Я попытался реализовать это решение, и я получаю «нестатический метод GetItems (), на который нельзя ссылаться из статического контекста», указывающий на ArrayList<Item> items = ParentObject.GetItems();
2. Вы определили метод GetItems?
3. Да, я сделал, точно так же, как вы сделали в edit. Однако я добавил @JsonProperty («элементы»). Редактировать: Хорошо, подождите. Я все перепутал. Дайте мне секунду, кажется, теперь это работает.
4. Спасибо 🙂 Теперь он работает безупречно. Если позволите — у меня есть еще один вопрос: что мне теперь делать, если, например, я хотел бы напечатать только эти элементы, у которых otherId / first равен «xyz»? Должен ли я сделать что-то вроде «ParentObject.GetItems().get() […]»?
5. Нет проблем. Что касается вашего второго вопроса, вы хотите знать, как выполнить итерацию по списку массивов и распечатать только то содержимое, которое соответствует определенным критериям? Это звучит не по теме из этого поста. Возможно, вы захотите выполнить поиск или опубликовать другой вопрос отдельно.