jackson - 我如何将 JSON 属性反序列化为 Jackson 中的 Java 对象
问题描述
鉴于此响应:
{
"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。我想避免创建不必要的包装类。
解决方案
尝试这个?https://json2csharp.com/json-to-pojo
// import com.fasterxml.jackson.databind.ObjectMapper; // version 2.11.1
// import com.fasterxml.jackson.annotation.JsonProperty; // version 2.11.1
/* ObjectMapper om = new ObjectMapper();
Root root = om.readValue(myJsonString), Root.class); */
public class Counts{
public int subscriptions;
public int spots;
public int comments;
public int impressions;
public int respots;
public int attachments;
public int maps;
}
public class User{
public int id;
public String name;
public String screen_name;
public Object url;
public Object location;
public Object profile_picture;
public Object picture_url;
public Object header_picture;
public Object about;
public Counts counts;
}
public class MapSettings{
public List<String> editor_access;
public List<String> visitor_access;
public boolean respotting_to_this_map;
}
public class Data{
public int id;
public String title;
public String description;
public String visibility;
public Object picture_url;
public Object logo_picture;
public int owner_id;
public Date created_at;
public Date updated_at;
public Counts counts;
public User user;
public MapSettings map_settings;
}
public class Meta{
public int code;
}
public class Root{
public Data data;
public Meta meta;
}
推荐阅读
- javascript - 固定位置不会在其他浏览器中保持固定
- c++ - 如何仅检测图像中烧杯内的水或溶液。(OPENCV)
- javascript - 使用 JavaScript 在 Chrome 中填写输入框
- jquery - Jquery pageload选择更改在移动设备上不起作用
- swift - 动态检查元类型一致性
- ubuntu-18.04 - Ubuntu 18.04 上的 zfs 传统挂载
- angular - 角度从 8 升级到 9 - 纱线不兼容错误
- python - 计算矩阵中每一行的最大值(不包括其自己的列)的更有效方法是什么?
- java - 我如何将 jooq 与 javers 一起使用?
- c# - C# Sqlite 没有更新