Bootstrap

java遍历json泛型集合_java – JSON泛型集合反序列化

我用Java编写了这样的DTO类:

public class AnswersDto {

private String uuid;

private Set answers;

}

public class AnswerDto {

private String uuid;

private AnswerType type;

private T value;

}

class LocationAnswerDto extends AnswerDto {

}

class JobTitleAnswerDto extends AnswerDto {

}

public enum AnswerType {

LOCATION,

JOB_TITLE,

}

class Location {

String text;

String placeId;

}

class JobTitle {

String id;

String name;

}

在我的项目中,Jackson库用于JSON的序列化和反序列化.

如何配置AnswersDto(使用特殊注释)或AnswerDto(注释)类,以便能够在其正文中使用AnswersDto正确反序列化请求,例如:

{

"uuid": "e82544ac-1cc7-4dbb-bd1d-bdbfe33dee73",

"answers": [

{

"uuid": "e82544ac-1cc7-4dbb-bd1d-bdbfe33dee73",

"type": "LOCATION",

"value": {

"text": "Dublin",

"placeId": "121"

}

},

{

"uuid": "e82544ac-1cc7-4dbb-bd1d-bdbfe33dee73",

"type": "JOB_TITLE",

"value": {

"id": "1",

"name": "Developer"

}

}

]

}

不幸的是,Jackson默认将AnswerDto对象的值映射到LinkedHashMap而不是正确的(Location或JobTitle)类类型的对象.

我应该编写自定义JsonDeserializer< AnswerDto>或使用@JsonTypeInfo和@JsonSubTypes配置就足够了?

仅使用一个AnswerDto正确地反序列化请求

{

"uuid": "e82544ac-1cc7-4dbb-bd1d-bdbfe33dee73",

"type": "LOCATION",

"value": {

"text": "Dublin",

"placeId": "121"

}

}

我正在使用:

AnswerDto answerDto = objectMapper.readValue(jsonRequest, new TypeReference>() {

});

没有任何其他自定义配置.

最佳答案:

我已经通过使用Jackson的自定义注释@JsonTypeInfo和@JsonSubTypes解决了问题:

public class AnswerDto {

private String uuid;

private AnswerType type;

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.EXTERNAL_PROPERTY, property = "type")

@JsonSubTypes({

@JsonSubTypes.Type(value = Location.class, name = AnswerType.Types.LOCATION),

@JsonSubTypes.Type(value = JobTitle.class, name = AnswerType.Types.JOB_TITLE)

})

private T value;

}

标签:json,java,spring,deserialization,generic-collections

来源: https://codeday.me/bug/20190516/1114994.html

;