Невозможно десериализовать экземпляр java.util.ArrayList из токена START_OBJECT из моего основного класса pojo, для элементов типа POJO <generic>
У меня был этот вопрос раньше и разрешил его, поставив - @JsonIgnoreProperties(ignoreUnknown = true)
но теперь эта ошибка обрезана для разных наборов, но ignoreUnkown=true
больше не разрешается. Я получаю следующую ошибку -
Exception in thread "main" com.fasterxml.jackson.databind.JsonMappingException: Can not deserialize instance of java.util.ArrayList out of START_OBJECT token
at [Source: http://www.dishanywhere.com/radish/v20/dol/home/carousels/Movies.json; line: 1, column: 2787] (through reference chain: featuredMovies.JsonGenMov["tomatometer"])
вот мой основной класс POJO -
package featuredMovies;
import java.util.ArrayList;
import java.util.List;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;
@JsonIgnoreProperties(ignoreUnknown = true)
public class JsonGenMov{
private String _type;
private List cast;
private Common_sense_data common_sense_data;
private String common_sense_id;
private List crew;
private Number critics_rating;
private String description;
private Number franchise_id;
private List genres;
private String guid;
@JsonProperty("image")
private Images images;
private boolean is_locked;
private boolean is_mobile;
private boolean is_parental_locked;
private String kind;
private List<String> mobile_networks;
private List mobile_streams;
private String mpaa_rating;
private String name;
private List<Networks> networks;
private List<String> platforms;
private String player_type;
private String rating;
private List ratings;
private String release_date;
private Number run_time;
private String slug;
private String tms_id;
private List<Tomatometer> tomatometer;
public JsonGenMov(){
networks = new ArrayList<Networks>();
}
public String get_type(){
return this._type;
}
public void set_type(String _type){
this._type = _type;
}
public List getCast(){
return this.cast;
}
public void setCast(List cast){
this.cast = cast;
}
public Common_sense_data getCommon_sense_data(){
return this.common_sense_data;
}
public void setCommon_sense_data(Common_sense_data common_sense_data){
this.common_sense_data = common_sense_data;
}
public String getCommon_sense_id(){
return this.common_sense_id;
}
public void setCommon_sense_id(String common_sense_id){
this.common_sense_id = common_sense_id;
}
public List getCrew(){
return this.crew;
}
public void setCrew(List crew){
this.crew = crew;
}
public Number getCritics_rating(){
return this.critics_rating;
}
public void setCritics_rating(Number critics_rating){
this.critics_rating = critics_rating;
}
public String getDescription(){
return this.description;
}
public void setDescription(String description){
this.description = description;
}
public Number getFranchise_id(){
return this.franchise_id;
}
public void setFranchise_id(Number franchise_id){
this.franchise_id = franchise_id;
}
public List getGenres(){
return this.genres;
}
public void setGenres(List genres){
this.genres = genres;
}
public String getGuid(){
return this.guid;
}
public void setGuid(String guid){
this.guid = guid;
}
public Images getImages(){
return this.images;
}
public void setImages(Images images){
this.images = images;
}
public boolean getIs_locked(){
return this.is_locked;
}
public void setIs_locked(boolean is_locked){
this.is_locked = is_locked;
}
public boolean getIs_mobile(){
return this.is_mobile;
}
public void setIs_mobile(boolean is_mobile){
this.is_mobile = is_mobile;
}
public boolean getIs_parental_locked(){
return this.is_parental_locked;
}
public void setIs_parental_locked(boolean is_parental_locked){
this.is_parental_locked = is_parental_locked;
}
public String getKind(){
return this.kind;
}
public void setKind(String kind){
this.kind = kind;
}
public List getMobile_networks(){
return this.mobile_networks;
}
public void setMobile_networks(List mobile_networks){
this.mobile_networks = mobile_networks;
}
public List getMobile_streams(){
return this.mobile_streams;
}
public void setMobile_streams(List mobile_streams){
this.mobile_streams = mobile_streams;
}
public String getMpaa_rating(){
return this.mpaa_rating;
}
public void setMpaa_rating(String mpaa_rating){
this.mpaa_rating = mpaa_rating;
}
public String getName(){
return this.name;
}
public void setName(String name){
this.name = name;
}
public List getNetworks(){
return this.networks;
}
public void setNetworks(List networks){
networks.add(networks);
this.networks = networks.subList(0, 1);
}
public List getPlatforms(){
return this.platforms;
}
public void setPlatforms(List platforms){
this.platforms = platforms;
}
public String getPlayer_type(){
return this.player_type;
}
public void setPlayer_type(String player_type){
this.player_type = player_type;
}
public String getRating(){
return this.rating;
}
public void setRating(String rating){
this.rating = rating;
}
public List getRatings(){
return this.ratings;
}
public void setRatings(List ratings){
this.ratings = ratings;
}
public String getRelease_date(){
return this.release_date;
}
public void setRelease_date(String release_date){
this.release_date = release_date;
}
public Number getRun_time(){
return this.run_time;
}
public void setRun_time(Number run_time){
this.run_time = run_time;
}
public String getSlug(){
return this.slug;
}
public void setSlug(String slug){
this.slug = slug;
}
public String getTms_id(){
return this.tms_id;
}
public void setTms_id(String tms_id){
this.tms_id = tms_id;
}
public List<Tomatometer> getTomatometer(){
return this.tomatometer;
}
public void setTomatometer(List<Tomatometer> tomatometer){
this.tomatometer = tomatometer;
}
}
здесь находится Tomatometer POJO -
package featuredMovies;
import java.util.List;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
@JsonIgnoreProperties(ignoreUnknown = true)
public class Tomatometer{
private Number critic_review_count;
private String critic_review_url;
private Number critic_score;
private Number fan_review_count;
private String fan_review_url;
private Number fan_score;
public Number getCritic_review_count(){
return this.critic_review_count;
}
public void setCritic_review_count(Number critic_review_count){
this.critic_review_count = critic_review_count;
}
public String getCritic_review_url(){
return this.critic_review_url;
}
public void setCritic_review_url(String critic_review_url){
this.critic_review_url = critic_review_url;
}
public Number getCritic_score(){
return this.critic_score;
}
public void setCritic_score(Number critic_score){
this.critic_score = critic_score;
}
public Number getFan_review_count(){
return this.fan_review_count;
}
public void setFan_review_count(Number fan_review_count){
this.fan_review_count = fan_review_count;
}
public String getFan_review_url(){
return this.fan_review_url;
}
public void setFan_review_url(String fan_review_url){
this.fan_review_url = fan_review_url;
}
public Number getFan_score(){
return this.fan_score;
}
public void setFan_score(Number fan_score){
this.fan_score = fan_score;
}
}
EDIT: функция Parser, которую я использую, чтобы получить значения из моего класса POJO Tomatometer -
@SuppressWarnings("rawtypes")
public String[] getMovieTomatoMeterGopherParser (String url) throws JsonParseException, JsonMappingException, IOException{
System.err.println("STAGE 1");
URL jsonUrl = new URL(url);
ObjectMapper objmapper = new ObjectMapper();
objmapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
List<Tomatometer> jsonGenMovMovie_1 = objmapper.readValue(jsonUrl, new TypeReference<List<Tomatometer>>() {});
List<Tomatometer>[] Tmeter = new List [jsonGenMovMovie_1.size()];
String[] MoviesTmeter = new String[jsonGenMovMovie_1.size()];
int i = 0;
for(Tomatometer element : jsonGenMovMovie_1){
Tmeter[i]= element.getCritic_review_url();
MoviesTmeter[i]=Tmeter[i].toString();
i++;
}
return MoviesTmeter;
}
и здесь находится ERROR -
Exception in thread "main" com.fasterxml.jackson.databind.JsonMappingException: Can not deserialize instance of java.util.ArrayList out of START_OBJECT token
at [Source: http://www.dishanywhere.com/radish/v20/dol/home/carousels/Movies.json; line: 1, column: 2787] (through reference chain: featuredMovies.JsonGenMov["tomatometer"])
at com.fasterxml.jackson.databind.JsonMappingException.from(JsonMappingException.java:163)
at com.fasterxml.jackson.databind.DeserializationContext.mappingException(DeserializationContext.java:588)
at com.fasterxml.jackson.databind.DeserializationContext.mappingException(DeserializationContext.java:582)
at com.fasterxml.jackson.databind.deser.std.StringCollectionDeserializer.handleNonArray(StringCollectionDeserializer.java:216)
at com.fasterxml.jackson.databind.deser.std.StringCollectionDeserializer.deserialize(StringCollectionDeserializer.java:164)
at com.fasterxml.jackson.databind.deser.std.StringCollectionDeserializer.deserialize(StringCollectionDeserializer.java:154)
at com.fasterxml.jackson.databind.deser.std.StringCollectionDeserializer.deserialize(StringCollectionDeserializer.java:19)
at com.fasterxml.jackson.databind.deser.SettableBeanProperty.deserialize(SettableBeanProperty.java:336)
at com.fasterxml.jackson.databind.deser.impl.MethodProperty.deserializeAndSet(MethodProperty.java:89)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:290)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:112)
at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:226)
at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:203)
at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:23)
at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:2563)
at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:1789)
at final2.GopherMovieParsing.getMovieNamesGopherParser(GopherMovieParsing.java:96)
at final2.GopherMovieParsing.main(GopherMovieParsing.java:27)
Ответы
Ответ 1
Джексон говорит вам
Can not deserialize instance of java.util.ArrayList out of START_OBJECT token
at [...] (through reference chain: featuredMovies.JsonGenMov["tomatometer"])
Другими словами, он нашел поле, которое соответствует свойству POJO JsonGenMov#tomatometer
, которое объявлено как List
.
private List<Tomatometer> tomatometer;
Джексон десериализует массивы JSON в экземпляры ArrayList
по умолчанию. Однако Джексон нашел объект JSON, где ожидал, что массив JSON. Ваше POJO просто не соответствует вашему JSON.