上下文:我有两个从 API 返回的不同 JSON 响应。第一个是组合(电影和电视)剧组信用信息,第二个是仅电视剧组信用信息。
第一个 JSON 指定属性
media_type
,它确定应反序列化到哪个类。在下面您可以看到它可以是 movie
或 tv
。对于我的外部模型类CombinedCredits
,这有效。
当我尝试反序列化外部模型类的第二个 JSON 时,问题就出现了
TvCredits
。提供的 JSON not 包含 media_type
属性,因为它预计仅适用于电视。
尝试反序列化
TvCredits
时出现以下错误:
com.fasterxml.jackson.databind.exc.InvalidTypeIdException: Could not resolve subtype of [simple type, class info.movito.themoviedbapi.model.people.TvCrew]: missing type id property 'media_type' (for POJO property 'crew')
at [Source: REDACTED (`StreamReadFeature.INCLUDE_SOURCE_IN_LOCATION` disabled); line: 25, column: 9] (through reference chain: info.movito.themoviedbapi.model.people.TvCredits["crew"]->java.util.ArrayList[0])
我认为这是当 JSON 不具有预期的反序列化属性时使用接口的问题,但是我还能如何在不重复大量代码的情况下解决这个问题?
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "media_type")
@JsonSubTypes({
@JsonSubTypes.Type(value = MovieCrew.class, name = "movie"),
@JsonSubTypes.Type(value = TvCrew.class, name = "tv")
})
public interface Crew {
...
}
public class TvCrew implements Crew {
...
}
public class MovieCrew implements Crew {
...
}
public class CombinedCredits {
private List<Crew> crew;
...
}
public class TvCredits {
private List<TvCrew> crew;
...
}
使用
DEDUCTION
解决了这个问题。来自杰克逊文档:
或者,可以使用 @JsonTypeInfo(use=DEDUCTION) 来避免需要“type”字段。对于反序列化,类型是根据可用字段推导的。如果子类型没有不同的字段名签名或 JSON 无法解析为单个已知签名,则会引发异常。
@JsonTypeInfo(use = JsonTypeInfo.Id.DEDUCTION)
@JsonSubTypes({
@JsonSubTypes.Type(value = MovieCrew.class, name = "movie"),
@JsonSubTypes.Type(value = TvCrew.class, name = "tv")
})
public interface Crew {
...
}