【问题标题】:Create a factory JSON deserializers in Jackson在杰克逊创建工厂 JSON 反序列化器
【发布时间】:2013-12-10 19:37:18
【问题描述】:

我有一堆接口注释如下:

@MyAnnotation(DefaultImplementation.class)
interface SomeInterface {
    ...
}

以及相应的实现

class DefaultImplementation implements SomeInterface {
    ...
}

当我的 ObjectMapper 遇到 SomeInterface 类型的字段时,我希望它像 DefaultImplementation 一样反序列化它。也就是说,我想在反序列化过程中编码如下逻辑:

if (staticTypeToDeserialize.isAnnotationPresent(MyAnnotation.class))
    deserializeAs(type.getAnnotation(MyAnnotation.class).value());
else
    fallBackOnRegularDeserialization();

【问题讨论】:

    标签: json jackson deserialization


    【解决方案1】:

    希望我能给你一个完整的答案。 Jackson 可以通过 MixIn 做到这一点。我不是这方面的专家,但我最近这样做了......本质上,你将类型信息粘贴到 JSON 中,然后 Jackson 可以使用该类型信息以你想要的方式反序列化它。

    首先,您需要一个 mixin 类,该类知道您将要序列化和反序列化的类型。

    @JsonTypeInfo(
        use = JsonTypeInfo.Id.NAME,
        include = JsonTypeInfo.As.PROPERTY,
        property = "type")
    @JsonSubTypes({
        @JsonSubTypes.Type(value = MyString.class, name = "mystring"),
        @JsonSubTypes.Type(value = MyEvent.class, name = "myevent") })
    public abstract class PolymorphicMixIn {
    }
    

    在我的例子中,MyString 和 MyEvent 类派生自同一个基类。所以我坚持和离开杰克逊的一切都是那种类型。假设基类是 MyBaseClass。

    那么在你的 jackson 类中,你需要告诉对象映射器这件事。

    private ObjectMapper objectMapper = new ObjectMapper();
    objectMapper.addMixInAnnotations(MyBaseClass.class, PolymorphicMixIn.class);
    

    差不多就是这样。现在您只需调用 objectMapper.writeValueAsString ,它就会写入 Jackson 并粘贴类型信息。

    要读出它,只需传入你期望的类类型:

    MyString outputString = objectMapper.readValue(argAsString, MyString.class);
    

    我希望这足以让你到达你需要的地方!

    【讨论】:

    • 这不需要我为每个带有@MyAnnotaiton 的接口创建一个mixin 吗?这是不可取的。我希望能够轻松添加带有@MyAnnotation 注释的新接口。此外,这需要我修改 JSON 表示。这在我的设置中也是不可取的。这就是我认为我的反序列化器需要某种形式的工厂的原因(即一种基于@MyAnnotation 注释动态创建反序列化器的方法)
    猜你喜欢
    • 2015-04-07
    • 1970-01-01
    • 2016-10-23
    • 2014-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-20
    • 1970-01-01
    相关资源
    最近更新 更多