JacksonobjectMapper使用多个配置

cu6pst1q  于 2023-04-20  发布在  其他
关注(0)|答案(2)|浏览(155)

我有两个班:Class A包含Class B。我需要将json解编为Class A类型-但我需要Class A具有一组反序列化功能,Class B具有不同的集合。可能吗?最好的方法是什么?Thx!

nafvub8i

nafvub8i1#

实际上,如果你想在每次调用的基础上修改SerializationFeatureDeserializationFeature,你不想使用ObjectMapper中的方法,而是像这样构造ObjectReader和/或ObjectWriter

static final ObjectMapper mapper = ...; // only create once, acts as factor
// later on
byte[] json = mapper.writer(SerializationFeature.INDENT_OUTPUT)
    .without(SerializationFeature. WRAP_EXCEPTIONS)
    .writeValueAsBytes(value);
MyType result = mapper.readerFor(MyType.class)
    .with(DeserializationFeature.UNWRAP_ROOT_VALUE)
    // and more 'with' or 'without' calls
    readValue(json);

请注意,ObjectMapper的构造成本很高,而且示例绝对需要重用,而ObjectReaderObjectWriter的构造成本很低,并且是在每次读/写的基础上完成的。因此,尽管它们可以重用(示例是完全线程安全的,不可变的),但并不一定需要太多。

yshpjwxd

yshpjwxd2#

最终,我通过为内部类型定义自己的反序列化器,并在内部定义自己的新静态ObjectMapper来保存所需的配置,解决了这个问题。

public ObjectMapper MyObjectMapper() {
    ObjectMapper objectMapper = new ObjectMapper();

    objectMapper            
            .setAnnotationIntrospector(new JaxbAnnotationIntrospector(TypeFactory.defaultInstance()))           
    SimpleModule simpleModule = new SimpleModule("PostSurveyModule", Version.unknownVersion());
    simpleModule.addDeserializer(MyInnerObject.class, new MyInnerObjectDeserializer());
    objectMapper.registerModule(simpleModule);

    return objectMapper;
}

public static class MyInnerObjectDeserializer extends JsonDeserializer<MyInnerObject> {
    static ObjectMapper objectMapper = new ObjectMapper();

    static {
        objectMapper                
                .setVisibilityChecker(objectMapper.getDeserializationConfig().getDefaultVisibilityChecker()
                .withGetterVisibility(JsonAutoDetect.Visibility.PUBLIC_ONLY));

        objectMapper.addMixInAnnotations(MyInnerObject.class, MyInnerObjectMixin.class); //some mixin to add
        
    }   

    @Override
    public MyInnerObject deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException {
        MyInnerObject myInnerObject = objectMapper.readValue(jp, MyInnerObject.class);
        return myInnerObject;
    }
}

相关问题