当返回类型为标记接口时使用 Jackson 进行多态序列化

2024-03-08

我有一个返回标记接口的休息服务,并且该接口有多个实现,并且在实现中没有任何公共属性。

    @RequestMapping(value = "/users/{userName}", method = RequestMethod.GET)
    public User getUser(@PathVariable("userName") String userName) {
        return userService.getUser(userName);
    }

用户及其实现。注意:用户是标记接口。

public interface User {}

public AdminUser implements User { // some properties & its setters & getters } 

public SupportUser implements User { // some properties & its setters & getters } 

我使用 Jackson 1.9.1 进行序列化和反序列化。

当我点击上述服务时,我得到以下响应

{}

当我调试它时,我看到用户实现对象已准备好并发送回杰克逊进行序列化。但是杰克逊正在向浏览器发送空响应。任何人都可以建议当返回类型是标记接口时如何使用序列化。


Use @JsonTypeInfo and @JsonSubTypes反序列化多态类型,它在序列化 java 对象并重新创建确切的子类型时维护子类型信息。

举个例子,动物是一个接口,它可以是老虎或狮子,它们都扩展了动物接口。在反序列化时,我们希望创建确切的动物类型并演示 @JsonTypeInfo 和 @JsonSubTypes 注释的使用。

@JsonTypeInfo(use=JsonTypeInfo.Id.NAME,
        include=JsonTypeInfo.As.PROPERTY,
        property="name")
@JsonSubTypes({
        @JsonSubTypes.Type(value=Lion.class, name="lion"),
        @JsonSubTypes.Type(value=Tiger.class, name="tiger"),
})
public interface Animal {

}

@JsonTypeName("lion")
public class Lion implements Animal {

    private String name;
    private String roar;

//constructor & setters & getters
}

@JsonTypeName("tiger")
public class Tiger implements Animal {

    private String name;
    private String purr;

//constructor & setters & getters
}

主要方法:

List<Animal> animal = new ArrayList<Animal>();
animal.add(new Lion("lion", "roar"));
animal.add(new Tiger("tiger", "purr"));
animal.add(new Tiger("tiger", "purrrrrrrrr"));

URL url = JacksonPolymorphicSerialization.class.getClassLoader().getResource("animals.json");
File file = new File(url.getPath());

// de-serailization sub types
new ObjectMapper().writeValue(file, animal);

// serailization animals and its subtype
List<Animal> animals = new ObjectMapper().readValue(file, List.class);
System.out.println(animals);


output : [{name=lion, roar=roar}, {name=tiger, purr=purr}, {name=tiger, purr=purrrrrrrr}]

希望这可以帮助您理解使用 Jackson 的序列化和反序列化多态类型。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当返回类型为标记接口时使用 Jackson 进行多态序列化 的相关文章

随机推荐