【问题标题】:Java Generics : Object Mapper Converting JSON to Java ObjectJava 泛型:对象映射器将 JSON 转换为 Java 对象
【发布时间】:2019-07-09 10:20:45
【问题描述】:

我想将 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,明天我想与Employee.class一起使用我将如何使用它?我不想为 Employee.class 写另一个方法
  • @Raghu 使用类?与 ObjectMapper 允许您将 JSON 转换为对象的方式完全相同。
  • 对泛型使用 deSerialize(json,class clazz)
  • @SHAHAKASH 你的评论是错误的。您正在混合方法定义和方法调用。

标签: java generics objectmapper jackson-databind


【解决方案1】:

由于类型擦除,Jackson 不支持带有泛型类型参数的 TypeReferenceHere's关于它的错误。

就您的用例而言,您根本不需要使用ObjectSerializer 类。您可以直接将ObjectMapper 对象暴露给您的服务层并执行反序列化。

如果您想从服务层屏蔽json 序列化机制,那么您可以将ObjectMapper 实现包装到另一个类中(就像您在代码中所做的那样),然后接受类类型作为方法参数而不是比泛型类型。

【讨论】:

  • 个人 person = mapper.readValue(inputJson,Person.class);谢谢。接受答案。
猜你喜欢
  • 2021-07-27
  • 2017-10-19
  • 1970-01-01
  • 1970-01-01
  • 2019-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多