2

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

4

2 回答 2

1

Actually if you want to change SerializationFeature or DeserializationFeature on per-call basis, you do not want use methods in ObjectMapper, but rather construct ObjectReader and/or ObjectWriter like so:

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

Note that whereas construction of ObjectMapper is expensive, and instance absolutely need to be reused, construction of ObjectReader and ObjectWriter are cheap and are meant to be done on per-read/-write basis. So while they can be reused (instances are fully thread-safe, immutable) there is not necessarily much need.

于 2015-03-29T23:30:22.667 回答
1

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

公共 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;

}

公共静态类 MyInnerObjectDeserializer 扩展 JsonDeserializer { 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;
}

}

于 2015-03-30T12:45:51.747 回答