ObjectMapper在rest模板中解析问题

时间:2018-03-18 06:08:02

标签: java json spring-boot jackson

以下是班级结构:

Response.java

@Getter
@Setter
public class Response implements Serializable{

  private final static long serialVersionUID = 8875657894025733696L;

  @JsonProperty ("status")
  public String status;

  @JsonProperty("payload")
  public Payload payload;
}

Payload.java

@Getter
@Setter
public class Payload<T> implements Serializable {

  private final static long serialVersionUID = 1732258949055126977L;

  @JsonProperty ("data")
  public List <T> data;
}

此处T是通用类

 Response response = restTemplate.postForObject(url, request, Response.class);

在上面的语句中,可以使用JavaType或TypeReference来替换Response.class,以便我可以List直接获得T response.getPayload().getData();的{​​{1}}?目前它以LinkedHashMap开始。

1 个答案:

答案 0 :(得分:0)

你在询问的是你是否可以确定(在运行时)要反序列化的对象的实际类型。杰克逊允许你这样做,带一些额外的注释。我很好奇这是如何工作的,几年前写了sample program来测试它。

请注意,有一些不同的选项(有关详细信息,请参阅JacksonPolymorphicDeserialization),并且我已选择仅实施其中一个。

在我的示例中,我只是使用属性来注释父类,以确定要反序列化的子类,以及哪些值映射到每个可能的子类:

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "type")
@JsonSubTypes({
    @JsonSubTypes.Type(value = Pet.class, name="pet"),
    @JsonSubTypes.Type(value = Child.class, name="child")
})
public abstract class Parent {...}