json 如何为Collections设置Jackson的反序列化策略以获取不可变类型的集合

xnifntxz  于 2022-12-24  发布在  其他
关注(0)|答案(1)|浏览(112)

这是一个java类的例子。我需要所有的字段在反序列化之后都是不可变的。
如果我将字段类型设置为ImmutableMap,就可以做到这一点,但是我可以指示Jackson将其反序列化为ImmutableMap,而不更改字段类型Map吗?

public class AdCategoryConfigImmute {
    
    private ImmutableMap<String, List<Integer>> sceneMap; // type is immutable explicitly
    
    private Map<String, List<Integer>> trMap;
}
ffscu2ro

ffscu2ro1#

为了指定需要反序列化的特定字段的子类型,可以使用@JsonDeserialize注解。需要通过其as属性提供所需类型。

public class AdCategoryConfigImmute {
    @JsonDeserialize(as = ImmutableMap.class)
    private Map<String, List<Integer>> sceneMap;
    
    // getter, setters
}

但是,由于这里需要Guava库中的ImmutableMap(或其子类型),因此需要注册Jackson的GuavaModule(链接到Maven repository),否则反序列化将失败。

  • 示例:*
public static void main(String[] args) throws IOException {
    String json = """
        {
            "sceneMap" : {
                "foo" : [1, 2, 3]
            }
        }
        """;

    ObjectMapper mapper = new ObjectMapper();
    mapper.registerModule(new GuavaModule());

    AdCategoryConfigImmute pojo = mapper.readValue(json, AdCategoryConfigImmute.class);

    System.out.println(pojo.getSceneMap().getClass());
}
  • 输出:*
class com.google.common.collect.SingletonImmutableBiMap

***注意:*如果您使用Sping Boot ,它会在应用程序启动时配置ObjectMapper时为您注册GuavaModule(无需手动注册模块,您只需添加一个依赖项)。

相关问题