首页 > 解决方案 > 我如何将 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。我想避免创建不必要的包装类。

标签: jacksonrest-assuredjackson-databind

解决方案


尝试这个?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;
}

推荐阅读