1. Джексон в массив
Конструкторское местное внимание класс сущности не должен быть никаких аргументов, в противном случае они будут сообщены ненормальными
//com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Невозможно построить экземпляр `com.example.jackjson.UnmarshallCollectionOrArray $ User` (нет Творцы, как конструкции по умолчанию, не существует): не может десериализации от стоимости объекта (delegate- или свойство на основе Creator)
пакет com.example.jackjson; импорт com.fasterxml.jackson.core.type.TypeReference; импорт com.fasterxml.jackson.databind.ObjectMapper; импорт com.fasterxml.jackson.databind.type.CollectionType; импорт org.assertj.core.util.Lists; импорт org.junit.Assert; импорт org.junit.Test; импорт java.io.IOException; импорт java.util.ArrayList; импорт java.util.LinkedHashMap; импорт java.util.List; / * * * @Author: GuanBin * @date: Созданный в下午2:33 2019/8/31 * / общественного класса UnmarshallCollectionOrArray { @Test общественного ничтожной unmarshallToArray () бросает IOException { ObjectMapper картографа = новый новый ObjectMapper (); ArrayList <Пользователь> Пользователи = Lists.newArrayList ( новый новый пользователь ( " Томь " , 10 ), новый новый пользователь ( " SAM " , 11. )); Строка STR = mapper.writeValueAsString (пользователи); система. OUT .println ( « пользователь JSON: » + STR); // если пользователь не дают конструктор без аргументов //com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Невозможно построить экземпляр `com.example.jackjson.UnmarshallCollectionOrArray $ User` (нет Творцы, как конструкции по умолчанию, не существует): не может десериализации от стоимости объекта (без delegate- или собственность- основанный Creator) // в [Источник: (String) "[{" имя ":" Томь " "возраст": 10}, { "имя": "САМ", "возраст": 11}]"; Линия: 1, колонок: 3] (через эталонную цепь: java.lang.Object [] [0]) Пользователь [] userArray = mapper.readValue (., ул пользователь [] класс ); Assert.assertTrue (userArray [ 0 ] InstanceOf пользователя); Пользователь (имя String, ИНТ возраст) { это .name = имя; это .age = возраст; } Частное имя строки; частный ИНТ возраст; общественный Строка GetName () { возвращение имя; } Общественная пустота SetName (имя String) { это .name = имя; } Общественного ИНТ СеЬАд () { возвращение возраст; } Общественного недействительный ЗеЬАд ( ИНТвозраст) { это .age = возраст; } } }
2. Джексон преобразуется в список
1) Если прямое использование mapper.readValue (ул List.class), хотя не редкость, но этот список является LinkedHashMap каждый элемент, и сильный коммутатор пользователя отдается, если он преобразуется в список <User> с этим метод не работает
@Test общественный недействительный unmarshallToList () бросает IOException { ObjectMapper картостроитель = новый ObjectMapper (); ArrayList <Пользователь> Пользователи = Lists.newArrayList ( новый пользователь ( " Томь " , 10 ), новый пользователь ( " сэм " , 11 )); Строка ул = mapper.writeValueAsString (пользователей); Система. из .println ( " пользователь JSON: " + ул); // 若пользователь没无参构造方法会报错 // com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Невозможно построить экземпляр `com.example.jackjson.UnmarshallCollectionOrArray $ User` (нет Творцы, как конструкции по умолчанию, не существует): не может десериализации от стоимости объекта (delegate- или свойство на основе Creator) // в [Источник: (String) "[{" имя ":" Томь " "возраст": 10}, { "имя": "САМ", "возраст": 11}]"; Линия: 1, колонок: 3] (через эталонную цепь: java.lang.Object [] [0]) список Списка = mapper.readValue (., ул Список классов ); Assert.assertTrue (список. Получить ( 0 ) InstanceOf LinkedHashMap); }
2) прямо в список из двух способов
1.使用Тип Reference
Список <Пользователь> Список = mapper.readValue (улица, новый TypeReference <List <User >> () {});
@Test общественный недействительный unmarshallToListOneWay () бросает IOException { ObjectMapper картостроитель = новый ObjectMapper (); ArrayList <Пользователь> Пользователи = Lists.newArrayList ( новый пользователь ( " Томь " , 10 ), новый пользователь ( " сэм " , 11 )); Строка ул = mapper.writeValueAsString (пользователей); Система. из .println ( " пользователь JSON: " + ул); // 若пользователь没无参构造方法会报错 // com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Невозможно построить экземпляр `com.example.jackjson.UnmarshallCollectionOrArray $ User` (нет Творцы, как конструкции по умолчанию, не существует): не может десериализации от стоимости объекта (delegate- или свойство на основе Creator) // в [Источник: (String) "[{" имя ":" Томь " "возраст": 10}, { "имя": "САМ", "возраст": 11}]"; Линия: 1, колонок: 3] (через эталонную цепь: java.lang.Object [] [0]) Список <Пользователь> Список = mapper.readValue ( ул, новый TypeReference <Список <Пользователь >> () {}); Assert.assertTrue (. Список получить ( 0 ) InstanceOf пользователя);
2. Получить CollectionType
. CollectionType javaType = mapper.getTypeFactory () constructCollectionType (List.class, User.class);
Список <Пользователь> Список = mapper.readValue (ул javaType);
@Test общественный недействительный unmarshallToListTwoWay () бросает IOException { ObjectMapper картостроитель = новый ObjectMapper (); ArrayList <Пользователь> Пользователи = Lists.newArrayList ( новый пользователь ( " Томь " , 10 ), новый пользователь ( " сэм " , 11 )); Строка ул = mapper.writeValueAsString (пользователей); Система. из .println ( " пользователь JSON: " + ул); // 若пользователь没无参构造方法会报错 // com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Невозможно построить экземпляр `com.example.jackjson.UnmarshallCollectionOrArray $ User` (нет Творцы, как конструкции по умолчанию, не существует): не может десериализации от стоимости объекта (delegate- или свойство на основе Creator) // в [Источник: (String) "[{" имя ":" Томь " "возраст": 10}, { "имя": "САМ", "возраст": 11}]"; Линия: 1, колонок: 3] (через эталонную цепь: java.lang.Object [] [0]) CollectionType javaType . = mapper.getTypeFactory () constructCollectionType (. Список классы ., Пользовательский класс ); Список <Пользователь> Список = mapper.readValue (ул javaType); Assert.assertTrue (список.) InstanceOf пользователя); }
Примечание: Приведенный выше процесс преобразования не требует аргументов конструктора объекта, в противном случае они будут сообщены ненормальными
демонстрационный тест: https://github.com/BinbinGuan/rabbitMq-test/commit/2c27f547ff4fdb249cd0d64294e3855d00993a96