Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Jackson ObjectMapper集JsonFormat.Shape.ARRAY不带注释_Java_Json_Spring_Jackson_Objectmapper - Fatal编程技术网

Java Jackson ObjectMapper集JsonFormat.Shape.ARRAY不带注释

Java Jackson ObjectMapper集JsonFormat.Shape.ARRAY不带注释,java,json,spring,jackson,objectmapper,Java,Json,Spring,Jackson,Objectmapper,我需要使用两个jackson 2对象映射器。 两个映射器使用同一组类。 首先,我需要使用标准序列化。 在第二个示例中,我希望对所有类使用数组形状类型(请参见) 但我想为我的第二个ObjectMapper全局设置此功能。类似mapper.setShape(…) 怎么做 UPD: 我找到了一种覆盖类配置的方法: mapper.configOverride(MyClass.class) .setFormat(JsonFormat.Value.forShape(JsonFormat.Shape.A

我需要使用两个jackson 2对象映射器。 两个映射器使用同一组类。 首先,我需要使用标准序列化。 在第二个示例中,我希望对所有类使用数组形状类型(请参见)

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

怎么做

UPD:

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

mapper.configOverride(MyClass.class)
   .setFormat(JsonFormat.Value.forShape(JsonFormat.Shape.ARRAY));
因此,我可以使用反射API更改我的所有类


令人尴尬的是,我覆盖了全局设置,但我不能直接设置它。

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

但是,您可以为类型(将值转换为数组)编写自己的
序列化程序
,并在
对象映射器
中对其进行配置,例如:

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();
    }
}

感谢我需要知道如何做到这一点:-)谢谢你,你的更新比公认的答案更好,因为它符合你的要求。按照公认的答案添加自定义序列化程序似乎是一种做同样事情的冗长得多的方法。
ObjectMapper mapper = new ObjectMapper();
SimpleModule module = new SimpleModule();
module.addSerializer(String.class, new CustomDeserializer());
mapper.registerModule(module);