如何将JSON对象从第三方api转换为本地POJO

时间:2016-03-28 18:18:02

标签: java json deserialization

假设我打电话给第三方API以获取对象任务,我得到以下JSON字符串作为回报:

 {
    "tasks": [
      {
        "id": 1,
        "code": "CODE",
        "description": "Dummy Task",
        "withConfirmation": false,
        "resource": {
          "id": "abcdef12-fe14-57c4-acb5-1234e7456d62",
          "group": "Doctor",
          "firstname": "Toto",
          "lastname": "Wallace",
      },
      {
        "id": 2,
        "code": "CODE",
        "description": "Dummyyy Taaask",
        "withConfirmation": false
      }
    ]
 }

在返回的json中,我们有任务,可以使用资源加入。

在我们的系统中,任务如下所示:

@JsonAutoDetect
public class Task implements Serializable {

    private Integer id;
    private String code = "BASIC";
    private String description;
    private boolean withConfirmation = false;


    /**
     * CONSTRUCTOR
     */
    public Task() {
    }
    public Integer getId() {
        return id;
    }

    @JsonProperty
    public String getCode() {
        return code;
    }
    public void setCode(String code) {
        this.code = code;
    }

    @JsonProperty
    public String getDescription() {
        return description;
    }
    public void setDescription(String description) {
        this.description = description;
    }

    @JsonProperty
    public boolean isWithConfirmation() {
        return withConfirmation;
    }
    public void setWithConfirmation(boolean withConfirmation) {
        this.withConfirmation = withConfirmation;
    }

    public String toString() {...
    }
}

资源看起来像这样:

public class Resource implements Serializable {
    ...

    private String firstname;
    private String lastname;
    private MedicalGroup group; // id + name + description
    private Set<Task> tasks = new HashSet<Task>(0);
    ...
    // getters and setters and toString etc.
    ...
}

因此,除了字段名称之外,主要区别在于任务不包含任何资源,但关系方向相反,这意味着< em>资源可以保存 n 任务

对于这种情况,从第三方序列化返回的json对象并将其转换/映射到我自己系统的pojo的最佳方法是什么? 我目前正在阅读Gson doc以试用它,但欢迎提出任何建议。 此代码必须易于重复使用,因为在多个项目中需要它。

2 个答案:

答案 0 :(得分:1)

这不是完整的工作代码,因为我不知道您希望如何使用Resource。 Json应该创建新资源还是尝试查找已存在的资源。你将如何从json创建MedicalGroup,因为它不是enuogh数据。我会在评论中问这个,但没有足够的空间。以下是演示如何尝试解决除Resources to/from json映射之外的大多数问题。

主要想法是在@JsonAnyGetter public Map<String, Object> getAdditionalProperties() POJO中添加@JsonAnySetter public void setAdditionalProperty(String name, Resource value)Task

    @JsonAnyGetter
    public Map<String, Object> getAdditionalProperties() {

        HashMap<String, Object> map= new HashMap<>();

        // IMPORTANT
        // here we can try to find resource that has this task
        // and export its info to json like this:


        // CHANGE THIS
        Resource res = new Resource();
        res.firstname = "Toto";
        res.lastname = "Wallace";

        // IMPORTANT END

        map.put("resource", res);

        return map;
    }

    @JsonAnySetter
    public void setAdditionalProperty(String name, Resource value) {
        // IMPORTANT
        // Here you have to create or find appropriate Resource in your code
        // and add current task to it
        System.out.println(name+" "+ value );
    }

完整演示:

import com.fasterxml.jackson.annotation.*;
import com.fasterxml.jackson.databind.ObjectMapper;

import java.io.IOException;
import java.io.Serializable;
import java.util.*;

public class Main3 {
private static String json = "{\n" +
        "    \"tasks\": [\n" +
        "      {\n" +
        "        \"id\": 1,\n" +
        "        \"code\": \"CODE\",\n" +
        "        \"description\": \"Dummy Task\",\n" +
        "        \"withConfirmation\": false,\n" +
        "        \"resource\": {\n" +
        "          \"id\": \"abcdef12-fe14-57c4-acb5-1234e7456d62\",\n" +
        "          \"group\": \"Doctor\",\n" +
        "          \"firstname\": \"Toto\",\n" +
        "          \"lastname\": \"Wallace\"\n" +
        "      }},\n" +
        "      {\n" +
        "        \"id\": 2,\n" +
        "        \"code\": \"CODE\",\n" +
        "        \"description\": \"Dummyyy Taaask\",\n" +
        "        \"withConfirmation\": false\n" +
        "      }\n" +
        "    ]\n" +
        " }";

public static void main(String[] args) throws IOException {
    ObjectMapper mapper = new ObjectMapper();
    TasksList tl = mapper.readValue(json, TasksList.class);
    String result = mapper.writeValueAsString(tl);
    System.out.println(result);
}

private static class TasksList {
    @JsonProperty(value = "tasks")
    private List<Task> tasks;
}
@JsonIgnoreProperties(ignoreUnknown = true)
public static class Resource implements Serializable {
    @JsonProperty(value = "firstname")
    private String firstname;
    @JsonProperty(value = "lastname")
    private String lastname;

    // HAVE NO IDEA HOW YOU GONNA MAP THIS TO JSON
    // private MedicalGroup group; // id + name + description
    private Set<Task> tasks = new HashSet<Task>(0);

    @Override
    public String toString() {
        return "Resource{" +
                "firstname='" + firstname + '\'' +
                ", lastname='" + lastname + '\'' +
                ", tasks=" + tasks +
                '}';
    }
}

@JsonAutoDetect
public static class Task implements Serializable {

    private Integer id;
    private String code = "BASIC";
    private String description;
    private boolean withConfirmation = false;

    /**
     * CONSTRUCTOR
     */
    public Task() {
    }
    public Integer getId() {
        return id;
    }

    @JsonProperty
    public String getCode() {
        return code;
    }
    public void setCode(String code) {
        this.code = code;
    }

    @JsonProperty
    public String getDescription() {
        return description;
    }
    public void setDescription(String description) {
        this.description = description;
    }

    @JsonProperty
    public boolean isWithConfirmation() {
        return withConfirmation;
    }
    public void setWithConfirmation(boolean withConfirmation) {
        this.withConfirmation = withConfirmation;
    }

    @JsonAnyGetter
    public Map<String, Object> getAdditionalProperties() {

        HashMap<String, Object> map= new HashMap<>();

        // IMPORTANT
        // here we can try to find resource that has this task
        // and export its info to json like this:
        // CHANGE THIS

        Resource res = new Resource();
        res.firstname = "Toto";
        res.lastname = "Wallace";

        // IMPORTANT END

        map.put("resource", res);

        return map;
    }

    @JsonAnySetter
    public void setAdditionalProperty(String name, Resource value) {
        // IMPORTANT
        // Probably here you have to create or find appropriate Resource in your code
        // and add current task to it
        System.out.println(name+" "+ value );
    }

    @Override
    public String toString() {
        return "Task{" +
                "id=" + id +
                ", code='" + code + '\'' +
                ", description='" + description + '\'' +
                ", withConfirmation=" + withConfirmation +
                '}';
    }
}
}

答案 1 :(得分:0)

您可以通过Google使用git hash-object <important file> 库将Gson转换为Json

Pojo Class