如何使用jackson制作POJO并解析递归对象?

我有一个以下JSON响应,我从rest服务回来。 现在我需要将JSON响应下面的反序列化反转为POJO。 我正在和jackson合作。

{ "pagination": { "number": 1, "entriesPerPage": 200, "total": 3 }, "postings": [{ "categories": [{ "taskid": "79720", "name": "Sunglasses", "parentCategory": { "taskid": "394", "name": "Sunglasses & Fashion Eyewear", "parentCategory": { "taskid": "2340", "name": "Men's Accessories", "parentCategory": { "taskid": "10987", "name": "Clothing, Shoes & Accessories" } } } }] }, { "categories": [{ "taskid": "12980", "name": "Toys", "parentCategory": { "taskid": "123", "name": "Fashion", "parentCategory": { "taskid": "78765", "name": "Men's Accessories" } } }] }], "total": 2 } 

在上面的json中, postings是一个JSON数组,可以有多个posting json对象。 现在categories也是JSON数组。 现在棘手的部分是我可以在每个类别对象中有多个级别的parentCategory ,我不知道我将拥有多少级别的parentCategory 。 给出上面的JSON,我需要提取每个类别的taskid和最后一个parentCategory 。 所以它应该是这样的:

 79720=10987 12980=78765 

其中79720是类别的taskId, 10987是最后一个parentCategory 。 同样适用于其他人。

下面是我的代码,我通过进行http调用将JSON反序列化为我的POJO:

 ResponseEntity responseEntity = HttpClient.getInstance().getClient() .exchange(URI.create(endpoint), HttpMethod.POST, requestEntity, Stuff.class); Stuff response = responseEntity.getBody(); List postings = response.getPostings(); for(Posting postings : postings) { //.... } 

我有的困惑是 – 如何为上面的JSON制作POJO? 我尝试使用jsonschema2pojo,但它没有为parentCategory制作正确的类。 因为我可以拥有嵌套级别的parentCategory,这是我手头所不知道的。

这可能是用jackson做的吗?

这是为CategoryParentCategory生成的POJO类。 我不确定是否需要在此处进行任何更改,以便我可以解析递归的parentCategory对象。

 @JsonInclude(JsonInclude.Include.NON_NULL) @JsonPropertyOrder({"taskid", "name", "parentCategory"}) public class Category { @JsonProperty("taskid") private String taskid; @JsonProperty("name") private String name; @JsonProperty("parentCategory") private ParentCategory parentCategory; @JsonIgnore private Map additionalProperties = new HashMap(); ... } @JsonInclude(JsonInclude.Include.NON_NULL) @JsonPropertyOrder({"taskid", "name", "parentCategory"}) public class ParentCategory { @JsonProperty("taskid") private String taskid; @JsonProperty("name") private String name; @JsonProperty("parentCategory") private ParentCategory parentCategory; @JsonIgnore private Map additionalProperties = new HashMap(); ... } 

这次我会接近GSon

它以较少的努力管理递归。

Pojos可以从json2pojo网站制作,只需选择GSon作为JSon库。

这些是Pojos:

 import java.io.Serializable; import com.google.gson.annotations.Expose; import com.google.gson.annotations.SerializedName; public class Pagination implements Serializable { public Pagination() { super(); // TODO Auto-generated constructor stub } @SerializedName("number") @Expose private Integer number; @SerializedName("entriesPerPage") @Expose private Integer entriesPerPage; @SerializedName("total") @Expose private Integer total; private final static long serialVersionUID = 5114620434202813556L; public Integer getNumber() { return number; } public void setNumber(Integer number) { this.number = number; } public Integer getEntriesPerPage() { return entriesPerPage; } public void setEntriesPerPage(Integer entriesPerPage) { this.entriesPerPage = entriesPerPage; } public Integer getTotal() { return total; } public void setTotal(Integer total) { this.total = total; } } import java.io.Serializable; import java.util.List; import com.google.gson.annotations.Expose; import com.google.gson.annotations.SerializedName; public class Categories implements Serializable { public Categories() { super(); // TODO Auto-generated constructor stub } @SerializedName("pagination") @Expose private Pagination pagination; @SerializedName("postings") @Expose private List postings = null; @SerializedName("total") @Expose private Integer total; private final static long serialVersionUID = 4589512697836725240L; public Pagination getPagination() { return pagination; } public void setPagination(Pagination pagination) { this.pagination = pagination; } public List getPostings() { return postings; } public void setPostings(List postings) { this.postings = postings; } public Integer getTotal() { return total; } public void setTotal(Integer total) { this.total = total; } } import java.io.Serializable; import com.google.gson.annotations.Expose; import com.google.gson.annotations.SerializedName; public class Category implements Serializable { public Category() { super(); // TODO Auto-generated constructor stub } @SerializedName("taskid") @Expose private String taskid; @SerializedName("name") @Expose private String name; @SerializedName("parentCategory") @Expose private ParentCategory parentCategory; private final static long serialVersionUID = -2127963072268572959L; public String getTaskid() { return taskid; } public void setTaskid(String taskid) { this.taskid = taskid; } public String getName() { return name; } public void setName(String name) { this.name = name; } public ParentCategory getParentCategory() { return parentCategory; } public void setParentCategory(ParentCategory parentCategory) { this.parentCategory = parentCategory; } } import java.io.Serializable; import java.util.List; import com.google.gson.annotations.Expose; import com.google.gson.annotations.SerializedName; public class Posting implements Serializable { @SerializedName("categories") @Expose private List categories = null; private final static long serialVersionUID = 8135185675909461065L; public List getCategories() { return categories; } public Posting() { super(); // TODO Auto-generated constructor stub } public void setCategories(List categories) { this.categories = categories; } } import java.io.Serializable; import java.util.List; import com.google.gson.annotations.Expose; import com.google.gson.annotations.SerializedName; public class ParentCategory implements Serializable { @SerializedName("taskid") @Expose private String taskid; @SerializedName("name") @Expose private String name; @SerializedName("parentCategory") @Expose private List parentCategory; public ParentCategory() { super(); // TODO Auto-generated constructor stub } private final static long serialVersionUID = -5989749742502713615L; public String getTaskid() { return taskid; } public void setTaskid(String taskid) { this.taskid = taskid; } public String getName() { return name; } public void setName(String name) { this.name = name; } public List getParentCategory() { return parentCategory; } public void setParentCategory(List parentCategory) { this.parentCategory = parentCategory; } } 

所以这是一个测试实现:

  Pagination pagination = new Pagination(); pagination.setNumber(1); pagination.setEntriesPerPage(200); pagination.setTotal(3); Categories categories = new Categories(); categories.setPagination(pagination); Category category = new Category(); category.setName("Sunglasses"); category.setTaskid("79720"); List categoryList = new ArrayList(); Posting posting = new Posting(); posting.setCategories(categoryList); List parentCategoryList = new ArrayList(); List parentCategoryList2 = new ArrayList(); ParentCategory parentCategory1 = new ParentCategory(); parentCategory1.setName("Sunglasses & Fashion Eyewear"); parentCategory1.setTaskid("394"); ParentCategory parentCategory2 = new ParentCategory(); parentCategory2.setName("Men's Accessories"); parentCategory2.setTaskid("2340"); ParentCategory parentCategory3 = new ParentCategory(); parentCategory3.setName("Clothing, Shoes & Accessories"); parentCategory3.setTaskid("10987"); parentCategoryList.add(parentCategory2); parentCategoryList2.add(parentCategory3); parentCategory2.setParentCategory(parentCategoryList2); parentCategory1.setParentCategory(parentCategoryList); category.setParentCategory(parentCategory1); Gson gson = new Gson(); System.out.println(gson.toJson(category)); 

……这是由此产生的Json:

 { "taskid": "79720", "name": "Sunglasses", "parentCategory": { "taskid": "394", "name": "Sunglasses \u0026 Fashion Eyewear", "parentCategory": [{ "taskid": "2340", "name": "Men\u0027s Accessories", "parentCategory": [{ "taskid": "10987", "name": "Clothing, Shoes \u0026 Accessories" }] }] } } 

也许还需要一些调整,但你明白了。

希望能帮助到你!

编辑:作为操作请求我添加jackson版本。

的POJO:

 import java.io.Serializable; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonPropertyOrder; @JsonInclude(JsonInclude.Include.NON_NULL) @JsonPropertyOrder({"taskid", "name", "parentCategory"}) public class ParentCategory implements Serializable{ /** * */ private static final long serialVersionUID = 1L; @JsonProperty("taskid") private String taskid; @JsonProperty("name") private String name; @JsonProperty("parentCategory") private ParentCategory parentCategory; public String getTaskid() { return taskid; } public void setTaskid(String taskid) { this.taskid = taskid; } public String getName() { return name; } public void setName(String name) { this.name = name; } public ParentCategory getParentCategory() { return parentCategory; } public void setParentCategory(ParentCategory parentCategory) { this.parentCategory = parentCategory; } } import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonPropertyOrder; @JsonInclude(JsonInclude.Include.NON_NULL) @JsonPropertyOrder({"taskid", "name", "parentCategory"}) public class Category implements Serializable{ /** * */ private static final long serialVersionUID = 1L; @JsonProperty("taskid") private String taskid; @JsonProperty("name") private String name; @JsonProperty("parentCategory") private ParentCategory parentCategory; public String getTaskid() { return taskid; } public void setTaskid(String taskid) { this.taskid = taskid; } public String getName() { return name; } public void setName(String name) { this.name = name; } public ParentCategory getParentCategory() { return parentCategory; } public void setParentCategory(ParentCategory parentCategory) { this.parentCategory = parentCategory; } } public class Test { public static void main(String[] args) throws JsonProcessingException { Category category = new Category(); category.setName("Sunglasses"); category.setTaskid("79720"); List categoryList = new ArrayList(); List parentCategoryList = new ArrayList(); List parentCategoryList2 = new ArrayList(); ParentCategory parentCategory1 = new ParentCategory(); parentCategory1.setName("Sunglasses & Fashion Eyewear"); parentCategory1.setTaskid("394"); ParentCategory parentCategory2 = new ParentCategory(); parentCategory2.setName("Men's Accessories"); parentCategory2.setTaskid("2340"); ParentCategory parentCategory3 = new ParentCategory(); parentCategory3.setName("Clothing, Shoes & Accessories"); parentCategory3.setTaskid("10987"); parentCategory1.setParentCategory(parentCategory2); parentCategory2.setParentCategory(parentCategory3); category.setParentCategory(parentCategory1); ObjectMapper objectMapper = new ObjectMapper(); String testJson = objectMapper.writeValueAsString(category); System.out.println(testJson); } } 

再次测试结果:

 { "taskid": "79720", "name": "Sunglasses", "parentCategory": { "taskid": "394", "name": "Sunglasses & Fashion Eyewear", "parentCategory": { "taskid": "2340", "name": "Men's Accessories", "parentCategory": { "taskid": "10987", "name": "Clothing, Shoes & Accessories" } } } }