将Json转换为包含类型变量(某些子类)的Java对象

将Json转换为包含类型变量(某些子类)的Java对象,java,json,jackson,Java,Json,Jackson,我想将JSON映射到POJO。JSON格式为: { user: "123abc", messages: [ {"type":"A", "args": {"a":"str", "b":0} }, {"type":"B", "args": {"c":true, "d":false} }, ... ] } 每种类型的消息都有自己的预期参数。例如: class TypeAMessage extends Message {

我想将JSON映射到POJO。JSON格式为:

{
    user: "123abc",
    messages: [
        {"type":"A", "args": {"a":"str", "b":0} },
        {"type":"B", "args": {"c":true, "d":false} },
        ...
    ]
}
每种类型的消息都有自己的预期参数。例如:

class TypeAMessage extends Message {
    String a;
    int b;
}

class TypeBMessage extends Message {
    boolean c;
    boolean d;
}
我可以将此JSON映射到一个简单的POJO,如:

class Messages {
    @JsonProperty("user")
    String user;
    @JsonProperty("messageList")
    List<Message> messageList;

    class Message {
        @JsonProperty("type")
        String type;
        @JsonProperty("args")
        Map<String, Object> args;
    }
}
我使用的是Jackson JSON,JSON到对象的转换失败,出现了
无法识别的字段“a”(以及b、c、d),因为这些字段不在父
消息
类中


我走错方向了吗?或者有没有一种方法可以通过告诉JSON对象映射器查找要映射到的子对象来包含每个消息子对象?

尝试将内部类设置为静态

static class TypeAMessage extends Message {
    @JsonProperty("a")
    String a;
    @JsonProperty("b")
    int b;
}

static class TypeBMessage extends Message {
    @JsonProperty("c")
    boolean c;
    @JsonProperty("d")
    boolean d;
}

解决方案是在
Message
上添加一些注释,以便JSON反序列化器知道要使用
Message
的哪个子类:

class Messages {
    @JsonProperty("user")
    String user;

    @JsonProperty("messageList")
    List<Message> messageList;


    @JsonTypeInfo(use=JsonTypeInfo.Id.NAME, include=JsonTypeInfo.As.PROPERTY, 
            property="type")
    @JsonSubTypes( {
            @JsonSubTypes.Type(value=TypeAMessage.class, name="typeA"),
            @JsonSubTypes.Type(value=TypeBMessage.class, name="typeB")
    })

    static class Message {}

    static class TypeAMessage extends Message {
        @JsonProperty("a")
        String a;
        @JsonProperty("b")
        int b;
    }

    static class TypeBMessage extends Message {
        @JsonProperty("c")
        boolean c;
        @JsonProperty("d")
        boolean d;
    }
}

@mlk的可能副本谢谢链接。我翻遍了链接内容(以及链接的内容)并找到了解决方案。解决方案只需在问题上写上几行,似乎比链接中的问题更简单。所以我认为让这个问题保持开放并自己回答是有帮助的。如果你不反对,我会坚持到底。谢谢,尽管这并不能解决问题。请参考我发布的答案。
class Messages {
    @JsonProperty("user")
    String user;

    @JsonProperty("messageList")
    List<Message> messageList;


    @JsonTypeInfo(use=JsonTypeInfo.Id.NAME, include=JsonTypeInfo.As.PROPERTY, 
            property="type")
    @JsonSubTypes( {
            @JsonSubTypes.Type(value=TypeAMessage.class, name="typeA"),
            @JsonSubTypes.Type(value=TypeBMessage.class, name="typeB")
    })

    static class Message {}

    static class TypeAMessage extends Message {
        @JsonProperty("a")
        String a;
        @JsonProperty("b")
        int b;
    }

    static class TypeBMessage extends Message {
        @JsonProperty("c")
        boolean c;
        @JsonProperty("d")
        boolean d;
    }
}
{
    "user":"someUser",
    "messageList":[
        {"type":"typeA", "a":"someStr", "b":123}, 
        {"type":"typeB", "c":false, "d":true}
    ]
}