【发布时间】:2021-10-18 05:39:09
【问题描述】:
鉴于此响应:
{
"data": {
"id": 38943,
"title": "Appetere Platonem Tempor Interesset Natum",
"description": "epicuri alia atqui",
"visibility": "PUBLIC",
"picture_url": null,
"logo_picture": null,
"owner_id": 51065,
"created_at": "2021-08-16T05:59:15.325Z",
"updated_at": "2021-08-16T05:59:15.325Z",
"counts": {
"subscriptions": 0,
"spots": 0,
"comments": 0,
"impressions": 0,
"respots": 0,
"attachments": 0
},
"user": {
"id": 51065,
"name": "Jon",
"screen_name": "jon",
"url": null,
"location": null,
"profile_picture": null,
"picture_url": null,
"header_picture": null,
"about": null,
"counts": {
"maps": 26
}
},
"map_settings": {
"editor_access": [
"can_none.map",
"can_create.spots",
"can_create.events",
"can_create.comments",
"can_create.attachments",
"can_create.collaborators"
],
"visitor_access": [
"can_none.map",
"can_none.spots",
"can_none.events",
"can_create.comments",
"can_create.attachments",
"can_none.collaborators"
],
"respotting_to_this_map": false
}
},
"meta": {
"code": 200
}
}
如何将数据属性反序列化为这样的 MapDTO
@JsonIgnoreProperties(ignoreUnknown = true)
@Data
@Builder
@ToString
@NoArgsConstructor
@AllArgsConstructor
public class MapDTO {
private Integer id;
private String title;
private String description;
private String visibility;
@JsonAlias("picture_url")
private String pictureUrl;
@JsonAlias("logo_picture")
private String logoPicture;
@JsonAlias("owner_id")
private Integer ownerId;
@JsonAlias("created_at")
private String createdAt;
@JsonAlias("updated_at")
private String updatedAt;
private MapCountsDTO counts;
@JsonAlias("map_settings")
private MapSettingsDTO mapSettings;
}
我已经尝试使用自定义反序列化器,但是通过名称获取所有属性然后基于这些和嵌套对象创建一个新的 MapDTO 对象看起来很麻烦。如果结构发生变化,我必须更改解串器和 DTO 本身。让杰克逊从给定的根开始进行反序列化会更容易。我通过 RestAssured 4.4.0 使用 Jackson 2.12.4。我想避免创建不必要的包装类。
【问题讨论】:
-
如果您在顶层只有一个属性,您可以使用
UNWRAP_ROOT_VALUE功能。看看:Jackson json deserialization, ignore root element from json。但在这种情况下,它将不起作用。最简单、最可靠的方法是创建一个具有两个属性的根类,一个用于data,另一个用于meta对象。
标签: jackson rest-assured jackson-databind