Java Generics: Преобразование объекта JSON в объект Java

Я хотел бы десериализовать строку json в объект java. Я хотел написать общий метод.

public class ObjectSerializer<T> {

    T t;
    private ObjectMapper mapper = new ObjectMapper();


  /*  public Person deSerial(String json) throws Exception {
        TypeReference<Person> typeRef = new TypeReference<Person>() {};

        return mapper.readValue(json, typeRef);
    } */

    public T deSerialize(String jsonInput) throws Exception {
        TypeReference<T> typeRef
                = new TypeReference<T>() {};

       return mapper.readValue(jsonInput, typeRef);
    }
}

Когда я звоню deSerialize(validPersonJsonString) [validPersonJsonString : valid person JSON String], он не работает, он выдает мне ошибку:

java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to com.example.Person.

Принимая во внимание, что при вызове прокомментированного метода deSerial он работает нормально. Пожалуйста, объясните проблему.

Спасибо.

Я не вижу смысла использовать дженерик здесь. Просто передайте нужный класс deSerialize, назвав его как deSerialize(json, Person.class);. Гораздо проще, меньше шаблонов.

Tom 15.02.2019 10:47

Привет @ Том, Завтра я хочу использовать с Employee.class, как бы я его использовал? Я не хочу писать еще один метод для Employee.class

Raghu 15.02.2019 10:47

@Raghu использует Class<T>? точно так же, как ObjectMapper уже делает, чтобы позволить вам превращать JSON в объекты.

Worthless 15.02.2019 10:49

используйте deSerialize(json,class<T> clazz) для общего

Akash Shah 15.02.2019 10:51

@SHAHAKASH Ваш комментарий неверен. Вы смешиваете определение метода и вызов метода.

Tom 15.02.2019 10:55

До сих пор не ясно, как с этим справиться.

Raghu 15.02.2019 11:00
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
6
1 003
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Джексон не поддерживает TypeReference с параметрами универсального типа из-за стирания типа. Вот ошибка по этому поводу.

Что касается вашего варианта использования, вам вообще не нужно использовать класс ObjectSerializer. Вы можете напрямую предоставить объект ObjectMapper своему сервисному слою и выполнить десериализацию.

Если вы хотите оградить механизм сериализации json от своего сервисного уровня, вы можете обернуть реализацию ObjectMapper в другой класс (как вы сделали в своем коде), но затем примите тип класса в качестве аргумента метода, а не универсальный тип.

Человек-человек = mapper.readValue(inputJson,Person.class); Спасибо. Принял ответ.

Raghu 15.02.2019 11:05

Другие вопросы по теме