Джексон конвертирована Collection, массив

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

рекомендация

отwww.cnblogs.com/guanbin-529/p/11441805.html