当前位置: 首页 > 知识库问答 >
问题:

如何在Jackson中将JSON属性反序列化为Java对象

赵涵亮
2023-03-14

鉴于这种反应:

{
  "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本身。让Jackson从给定的根开始进行反序列化会更容易。我使用Jackson 2.12.4到ResAs的4.4.0。我想避免创建不必要的包装类。

共有2个答案

酆乐湛
2023-03-14

试试这个?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;
}
宋正真
2023-03-14

尝试使用jsonshema2pojo这个工具为您生成模型。

所有你需要:

  1. 将您的JSON响应复制并粘贴到窗口
  2. 在单选组中选择注释样式单选按钮Jackson 2. x
  3. 点击“预览”按钮
  4. 利润。
 类似资料:
  • 我需要反序列化以下json: 将它的< code>id属性设置为< code>foo_id json属性。 我需要在自定义反序列化程序中执行此操作。实现这一点最简单的方法是什么? 我想以某种方式将json“转换”为 然后将此委托给杰克逊。 在本例中,对象的类型为Foo,但其他对象可能不属于此类。另外,在本例中,json是一个数字,但如果它也是一个字符串,我希望支持。所以,我需要一种通用的方法来做到

  • 问题内容: 使用Jackson 2,我正在寻找一种 通用的 方式将对象序列化为单个值(然后序列化它们,然后再填充该单个字段),而不必重复创建JsonSerializer / JsonDeserializer来处理每种情况。@JsonIdentityInfo批注非常接近,但由于我知道,它将始终对完整的子对象进行序列化,因此略微遗漏了该标记。 这是我想做的一个例子。给定的类: 我希望Order可以序列

  • 问题内容: 有没有一种方法可以通过杰克逊将xml(例如int)序列化为xml属性?我找不到任何特别的杰克逊或json批注(@XmlAttribute @ javax.xml.bind.annotation.XmlAttribute)来实现此目的。 例如 我想要的是: 但是我得到的是: 有没有一种方法来获取属性而不是元素?感谢帮助! 问题答案: 好吧,我找到了解决方案。 如果您使用jackson-d

  • 给定一个JSON对象,它具有可变属性(例如标签),可以是原始值(例如字符串)或对象。假设的用例可以是标签多元化翻译的包装器: 或者 目标是使Jackson反序列化始终在Java端返回固定结构。因此,如果给定原语值,它总是转换为目标POJO的某个属性(例如其他),即: 目前,该问题通过使用自定义来解决,它检查属性是否为原语: 是否有一种更优雅的方法来处理可变JSON属性,而不需要在节点级别操作的解码

  • 有没有办法将一般对象序列化为Json并将Json反序列化为对象<如果对象是一个实体,我可以使用Jackson 2库来实现这个目的<但是如果对象是一个普通类,我该怎么做呢? 例如,我想序列化com.datastax.driver.core.querybuilder。将更新为Json并保存到DB,然后搜索并反序列化它以更新对象,最后将其用作com.datastax.driver.core.Sessio

  • 有人能帮助我,我如何反序列化下面的JSON,我不能改变?我正在使用Jackson进行序列化。 列可以具有未知数量的标题及其值,例如,“Header1”用于行数组中。 到目前为止,我有以下结构: 问题是当我反序列化成QueryResult时映射是空的;我了解TypeReference,但不知道如何指定TypeReference 编辑: 我的对象映射器代码如下: queryResultString的内