【问题标题】:How could I deserialize a JSON property into Java Object in Jackson我如何将 JSON 属性反序列化为 Jackson 中的 Java 对象
【发布时间】: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


【解决方案1】:

尝试使用jsonshema2pojo 此工具会为您生成模型。

所有你需要的:

  1. 将您的 JSON 响应复制并粘贴到窗口中
  2. 选择单选组“注释样式”单选按钮“Jackson 2.x”
  3. 点击“预览”按钮
  4. 利润。

【讨论】:

  • 我知道那个工具,但它会为我生成一个 Data 类,它基本上是一个包装器。最重要的是,在其他响应中,数据属性将代表另一种类型的对象,因此我最终会得到 DataMapDTO、UserDataDTO 等。我必须始终先使用 RestAssured 提取到 DataMapDTO,然后从中取出 MapDTO。
  • 我没有仔细阅读您的问题。现在我正在使用嵌套包装类,但我也很好奇如何制作扁平结构,所以我会密切关注这个话题。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-19
    • 2011-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-09
    相关资源
    最近更新 更多