java - Jackson - 反序列化为运行时指定的类

标签 java json jackson

我正在编写一个使用 Jackson 来序列化/反序列化对象的类。在编译时,我不知道要序列化/反序列化的对象的类型。

我阅读了几篇有关 TypeReferenceTypeFactory 用法的文章和问题,但我仍然遇到一些问题。

我的类看起来像(删除了一些不相关的代码):

public class JsonSerializer<T> {

  private ObjectMapper objectMapper;
  private TypeReference typeReference;

  @PostConstruct
  public void init() {
      objectMapper = new ObjectMapper();
      typeReference = new TypeReference<T>(){ };
  }

  // ...


  public Object decode(CachedData cachedData) {
    try {
        return objectMapper.readValue(cachedData.getData(), typeReference);
    } // ...
  }
}

这是我用来测试的代码片段:

public class SerializerTest {

  private JsonSerializer<Clazz> serializer;
  private ObjectMapper objectMapper = new ObjectMapper();
  private static final String CHARSET = "UTF-8";
  private Clazz data = generateData(); // creates a simple object

  @BeforeMethod
  public void beforeMethod() {
      serializer = new JsonSerializer<Clazz>();
      serializer.init();
  }

  // ...

  public void shouldDecodeDataCorrectly() throws Exception {
    CachedData cachedData = new CachedData(0, 
      objectMapper.writeValueAsString(data).getBytes(CHARSET), 
      CachedData.MAX_SIZE);

    Object object = serializer.decode(cachedData);
    assertEquals(data, object);
  }

  public static class Clazz {
    // POJO with getters and setters
  }

}

据我所知,使用 typeReference 应该足以让反序列化器知道从字节流读取的值应该放入 Clazz 对象中。但是,decode()方法返回的对象仍然是一个Map,我理解它是反序列化的默认类。

我还尝试更改 decode() 方法以返回 return objectMapper.readValue(cachedData.getData(), objectMapper.getTypeFactory().constructType(typeReference)) ,但我遇到了同样的问题。

我很确定这与我将类型传递到序列化器的方式有关,但到目前为止我还无法修复它。谢谢。

最佳答案

目前还不太清楚您到底想要做什么:大部分代码都没有进行更改。具体来说,TypeReference 的用法是错误的:您不能使用类型变量,类型必须是具体的。

但是,也许解决方案比您想象的更简单。如果您可以跟踪原始Class,只需存储它(或来自clazz.getName()的名称),并在反序列化时传递它。

关于java - Jackson - 反序列化为运行时指定的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12355742/

相关文章:

java - Spark 中的 DataFrame 到 Json 数组

java - 使用 Jackson 解析嵌套 JSON 数组

java - 当TAB 1的RecyclerView中添加数据时更新TAB 2 Recyclerview

java - Spring Rest - 具有 @ManyToOne 映射的字段为 null

java - 如何打乱键值对?

java - 具有 jackson 序列化/反序列化的多级多态树

java - Jackson 使用自定义反序列化器进行反序列化会导致大量 GC 调用并花费更长的时间

java - Jfree Chart 中日文语言不正确

php - java.lang.String 类型的值无法转换为 JSONArray

javascript - $.getJSON 没有进入函数并且没有获取任何数据