如何使用 Jackson 使用具有可为 null 属性的子类型进行反序列化?

问题描述 投票:0回答:1

上下文:我有两个从 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;

    ...
}
java json jackson deserialization jackson-databind
1个回答
0
投票

使用

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 {
    ...
}
© www.soinside.com 2019 - 2024. All rights reserved.