Java Jackson:反序列化泛型类型

时间:2014-06-24 21:55:45

标签: java jackson unmarshalling jackson-modules

我正在尝试反序列化TrainingData类,如下所示。 TrainingData使用gnerics,其中一个属性在其超类中声明。当我尝试反序列化JSON字符串以构造TrainingData对象时,我得到以下异常:

org.codehaus.jackson.map.JsonMappingException: No suitable constructor found for type [simple type, class TrainingData]: can not     instantiate from JSON object (need to add/enable type information?)
 at [Source: /home/shubham/workspace_smart_devices/ContextEngine/target/classes        /training.json; line: 2, column: 2]
    at org.codehaus.jackson.map.JsonMappingException.from(JsonMappingException.java:163)
    at org.codehaus.jackson.map.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:483)
    at org.codehaus.jackson.map.deser.BeanDeserializer.deserialize(BeanDeserializer.java:350)
    at org.codehaus.jackson.map.ObjectMapper._readMapAndClose(ObjectMapper.java:2395)
    at org.codehaus.jackson.map.ObjectMapper.readValue(ObjectMapper.java:1549)
    at main(IEStarter.java:52)

我使用以下JSON String来构造对象:

{
"UserCommand":
{
    "userId" : "1",
    "text" : "Play metallica",
    "perceptualContext" : {},
    "behavorialContext" : {}
    },
    "Context" :
    {
        "musicBand" : "metallica",
        "musicArtist" : null,
        "musicAlbum" : null,
        "musicSong" : null,
        "musicGenre" : null,
        "klass" : "PlayMusicContext"
    }
}

TrainingData.java

public class TrainingData<T extends Context> extends Data {

    private T context;

    public TrainingData (UserCommand u, T context) {
        super(u);
        this.context = context;
    }

    public Klass getKlass() {
        return context.getKlass();
    }
}

Data.java:

public class Data {
private UserCommand userCommand;

public Data(UserCommand userCommand) {
        this.userCommand = userCommand;
    }

}

PlayMusicContext.java

public class PlayMusicContext extends Context {

private final String musicBand;
private final String musicArtist;
private final String musicAlbum;
private final String musicSong;
private final String musicGenre;

public static class Builder {

    private String musicBand;
    private String musicArtist;
    private String musicAlbum;
    private String musicSong;
    private String musicGenre;

    public Builder() {}

    public Builder musicBand(String val) { musicBand = val; return this; }
    public Builder musicArtist(String val) { musicArtist = val; return this; }
    public Builder musicAlbum(String val) { musicAlbum = val; return this; }
    public Builder musicSong(String val) { musicSong = val; return this; }
    public Builder musicGenre(String val) { musicGenre = val; return this; }

    public PlayMusicContext build(Klass klass) {
        return new PlayMusicContext(this, klass);
    }
}

private PlayMusicContext(Builder builder, Klass klass) {
    super(klass);

    this.musicBand = builder.musicBand;
    this.musicArtist = builder.musicArtist;
    this.musicAlbum = builder.musicSong;
    this.musicSong = builder.musicSong;
    this.musicGenre = builder.musicGenre;
}
}

Context.java:

public abstract class Context {

    private Klass klass;

    public Context(Klass klass) {
        this.klass = klass;
    }

    public Klass getKlass() {
        return klass;
    }
}

我错过了什么?

0 个答案:

没有答案