我正在尝试反序列化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;
}
}
我错过了什么?