当前位置: 首页 > 知识库问答 >
问题:

用Jackson序列化/反序列化不同类型的地图

长孙章横
2023-03-14
Map<String, MyInterface> map1;

序列化和反序列化的方式不同于

Map<String, String> map2;

我已经创建了两个序列化程序

public class MyFirstSerializer extends JsonSerializer<Map<String, Property>> {
    ...
}

public class MySecondSerializer extends JsonSerializer<Map<String, String>> {
    ...
}
public class MyFirstDeserializer extends JsonDeserializer<Map<String, Property>> {
    ...
}
public class MySecondDeserializer extends JsonDeserializer<Map<String, String>> {
    ...
}
SimpleModule module = new SimpleModule("MyModule", new Version(1, 0, 0, "beta"));
module.addSerializer(new MyFirstSerializer());
module.addDeserializer((Class<Map<String, Property>>) (Class<?>) Map.class, new MyFirstDeserializer());

module.addSerializer(new MySecondSerializer());
module.addDeserializer((Class<Map<String, String>>) (Class<?>) Map.class, new MySecondDeserializer());

我用Jackson查看了序列化/反序列化映射 ,但找不到解决方案。

共有1个答案

许法
2023-03-14

我认为您可以使用jackson.core.type.typereference来完成这类工作:

Map<String, Property> parsed = 
    objectMapper.readValue(
        jsonString, 
        new TypeReference<Map<String, Property>>() {}
    );

typereference能够在运行时存储泛型类型参数,这使得jackson能够根据自定义(de)序列化程序中的任何需要推断值类型并正确地反序列化它。

另一种方法是使用显式定义的com.fasterxml.jackson.databind.type.CollectionType来取消json:

CollectionType collectionType =
    objectMapper.getTypeFactory()
        .constructMapType(Map.class, String.class, Property.class);
List<Map<String, Property>> objects = 
    mapper.readValue(jsonString, collectionType);
 类似资料:
  • 我的Spring Boot API使用camelCase,但我需要通过我的API将一些请求代理到使用snake_case的第三方API。是否可以将Jackson配置为从snake_case反序列化第三方响应,然后将其序列化回camelCase到我的前端? 所需功能的逐步示例: 示例对象: 我调用我的API API调用第三方 第三方返回 我的API将其反序列化为 我的API序列化对象并返回 现在我使

  • 问题内容: 我正在尝试制作一个使用Jackson来反序列化POJO的类。 看起来像这样… 我对此实施有2个问题。 首先是我将类类型传递给方法,以便对象映射器知道应反序列化的类型。有使用泛型的更好方法吗? 同样在get方法中,我将一个从objectMapper返回的对象强制转换为T。这看起来特别讨厌,因为我必须在此处强制转换T,然后还必须从调用它的方法中强制转换对象类型。 我在该项目中使用了Robo

  • 问题内容: 我有一个json字符串,应该将其反序列化为以下类 我该怎么做?这是通常的方式 但是我怎么提到T代表什么呢? 问题答案: 你需要为使用的每种通用类型创建一个对象,并将其用于反序列化。例如

  • 问题内容: 如果我有这样的类结构: 还有另一种反序列化的方法吗?在父类上使用此注释: 我不想强迫我的API的客户包括反序列化一个子类。 杰克逊不是使用,而是提供了一种方法来注释子类并通过唯一属性将其与其他子类区分开来?在上面的示例中,这类似于“如果JSON对象将其反序列化为,如果它将其反序列化为”。 问题答案: 感觉像是应该使用的东西,但是我在文档中进行了选择,可以提供的任何属性似乎都不符合您所描

  • 我有一个json字符串,我应该将其反序列化为以下类 我怎么做?这是通常的方式 但我怎么说T代表什么呢?

  • 假设我有以下格式的JSON: 我试图避免自定义反序列化程序,并试图将上述JSON(称为Wrapper.java)反序列化为JavaPOJO。“type”字段指示“object”反序列化,即type=foo表示使用foo.java反序列化“object”字段。(如果type=Bar,则使用Bar.java反序列化对象字段)。Metadata/owner将始终以相同的方式对每个元数据使用简单的带Jac