Я хотел бы десериализовать строку 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 он работает нормально. Пожалуйста, объясните проблему.
Спасибо.
Привет @ Том, Завтра я хочу использовать с Employee.class, как бы я его использовал? Я не хочу писать еще один метод для Employee.class
@Raghu использует Class<T>? точно так же, как ObjectMapper уже делает, чтобы позволить вам превращать JSON в объекты.
используйте deSerialize(json,class<T> clazz) для общего
@SHAHAKASH Ваш комментарий неверен. Вы смешиваете определение метода и вызов метода.
До сих пор не ясно, как с этим справиться.




Джексон не поддерживает TypeReference с параметрами универсального типа из-за стирания типа. Вот ошибка по этому поводу.
Что касается вашего варианта использования, вам вообще не нужно использовать класс ObjectSerializer. Вы можете напрямую предоставить объект ObjectMapper своему сервисному слою и выполнить десериализацию.
Если вы хотите оградить механизм сериализации json от своего сервисного уровня, вы можете обернуть реализацию ObjectMapper в другой класс (как вы сделали в своем коде), но затем примите тип класса в качестве аргумента метода, а не универсальный тип.
Человек-человек = mapper.readValue(inputJson,Person.class); Спасибо. Принял ответ.
Я не вижу смысла использовать дженерик здесь. Просто передайте нужный класс
deSerialize, назвав его какdeSerialize(json, Person.class);. Гораздо проще, меньше шаблонов.