Tôi đã lớp DTO như viết bằng Java:JSON bộ sưu tập chung deserialization
public class AnswersDto {
private String uuid;
private Set<AnswerDto> answers;
}
public class AnswerDto<T> {
private String uuid;
private AnswerType type;
private T value;
}
class LocationAnswerDto extends AnswerDto<Location> {
}
class JobTitleAnswerDto extends AnswerDto<JobTitle> {
}
public enum AnswerType {
LOCATION,
JOB_TITLE,
}
class Location {
String text;
String placeId;
}
class JobTitle {
String id;
String name;
}
Trong dự án của tôi có thư viện Jackson sử dụng cho serialization và deserialization của JSONs.
Làm thế nào để cấu hình AnswersDto
(sử dụng chú thích đặc biệt) hoặc AnswerDto
(chú thích cũng) các lớp học để có thể deserialize đúng yêu cầu với AnswersDto
trong cơ thể của nó, ví dụ:
{
"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"
}
}
]
}
Thật không may Jackson theo giá trị bản đồ mặc định của AnswerDto
đối tượng để LinkedHashMap
thay vì đối tượng thích hợp (Location
hoặc JobTitle
) loại lớp. Tôi có nên viết tùy chỉnh JsonDeserializer<AnswerDto>
hoặc cấu hình bằng cách sử dụng @JsonTypeInfo
và @JsonSubTypes
có thể là đủ?
Để deserialize đúng yêu cầu chỉ với một cú AnswerDto
dưới hình thức
{
"uuid": "e82544ac-1cc7-4dbb-bd1d-bdbfe33dee73",
"type": "LOCATION",
"value": {
"text": "Dublin",
"placeId": "121"
}
}
Tôi đang sử dụng:
AnswerDto<Location> answerDto = objectMapper.readValue(jsonRequest, new TypeReference<AnswerDto<Location>>() {
});
mà không cần bất kỳ cấu hình tùy chỉnh khác.
Bạn có một bộ sưu tập của các đối tượng aswer nhưng bạn muốn deserialize để chỉ một đối tượng câu trả lời? Điều gì về việc sử dụng AnswersDto answers = objectMapper.readValue (jsonRequest, TypeReference mới() {}); –
reos
Tôi muốn ánh xạ tất cả các đối tượng từ nút 'câu trả lời' đến bộ sưu tập' Set '. Khi tôi sử dụng 'objectMapper' với 'TypeReference ' này hơn là thuộc tính' value' của 'AnswerDto' từ bộ sưu tập được ánh xạ tới' LinkedHashMap'. –
Bananan