【问题标题】:Jackson ObjectMapper set JsonFormat.Shape.ARRAY without annotationJackson ObjectMapper 设置没有注释的 JsonFormat.Shape.ARRAY
【发布时间】:2017-10-29 23:23:05
【问题描述】:

我需要使用两个 jackson 2 对象映射器。 两个映射器都使用相同的类集。 首先,我需要使用标准序列化。 在第二个中,我想对所有类使用 ARRAY 形状类型(请参阅https://fasterxml.github.io/jackson-annotations/javadoc/2.2.0/com/fasterxml/jackson/annotation/JsonFormat.Shape.html#ARRAY)。

但我想为我的第二个 ObjectMapper 全局设置此功能。 mapper.setShape(...) 之类的东西

怎么做?

UPD:

我找到了一种方法来覆盖类的配置:

mapper.configOverride(MyClass.class)
   .setFormat(JsonFormat.Value.forShape(JsonFormat.Shape.ARRAY));

所以我可以使用反射 API 更改我的所有类。

尴尬的是我覆盖了全局设置,却不能直接设置。

【问题讨论】:

  • 谢谢!我需要知道如何做到这一点:-)
  • 谢谢,您的更新比接受的答案更好,因为它可以满足您的需求。根据接受的答案添加自定义序列化程序似乎是做同样事情的一种更冗长的方式。

标签: java json spring jackson objectmapper


【解决方案1】:

由于@JsonFormat 注释适用于字段,因此您不能在全局级别将其设置为Shape.Array。这意味着所有字段都将被序列化和反序列化为数组值(想象一下,如果一个字段已经是一个列表,在这种情况下,它将被包装到另一个我们可能不想要的列表中)。

但是,您可以为类型(将值转换为数组)编写自己的serializer 并在ObjectMapper 中进行配置,例如:

class CustomDeserializer extends JsonSerializer<String>{

    @Override
    public void serialize(String value, JsonGenerator gen, SerializerProvider serializers)
            throws IOException, JsonProcessingException {
        gen.writeStartArray();
        gen.writeString(value);
        gen.writeEndArray();
    }
}

并将其配置为ObjectMaper实例,例如:

ObjectMapper mapper = new ObjectMapper();
SimpleModule module = new SimpleModule();
module.addSerializer(String.class, new CustomDeserializer());
mapper.registerModule(module);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-19
    • 2014-05-24
    • 2019-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多