将对象数组解析为POJO

问题描述 投票:0回答:1

我正在尝试将GET调用的响应解析为POJO。这是一个示例JSON:

[
{
    "job-info": {
        "job-id": "1",
        "job-name": "abc",
        "system-id": "123",
        "job-priority": "1",
        "job-status": Queued",
    },
    "additional-job-details": {
        "job-name": "another job",
        "position-date": "2019-09-09T06",
    },
},
{
    "job-info": {
        "job-id": "2",
        "job-name": "abc",
        "system-id": "123",
        "job-priority": "1",
        "job-status": Queued",
    },
    "additional-job-details": {
        "job-name": "bob-job",
        "position-date": "2019-09-09T06",
    },
},
{
    "job-info": {
        "job-id": "3",
        "job-name": "abc",
        "system-id": "123",
        "job-priority": "1",
        "job-status": Queued",
    },
    "additional-job-details": {
        "job-name": "test-job",
        "position-date": "2019-09-09T06",
    },
}

]

我只需要job-info对象,并希望将它们存储到POJO列表中。这是我的JobInfo POJO:

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;

@JsonIgnoreProperties(ignoreUnknown = true)
public class JobInfo {

    @JsonProperty("job-id")
    private String jobId;
    @JsonProperty("job-name")
    private String jobName;
    @JsonProperty("system-id")
    private String systemId;
    @JsonProperty("job-priority")
    private String jobPriority;
    @JsonProperty("job-status")
    private String jobStatus;

    @JsonProperty("job-id")
    public String getJobId() {
        return jobId;
    }

    @JsonProperty("job-id")
    public void setJobId(String jobId) {
        this.jobId = jobId;
    }

    @JsonProperty("job-name")
    public String getJobName() {
        return jobName;
    }

    @JsonProperty("job-name")
    public void setJobName(String jobName) {
        this.jobName = jobName;
    }

    @JsonProperty("system-id")
    public String getSystemId() {
        return systemId;
    }

    @JsonProperty("system-id")
    public void setSystemId(String systemId) {
        this.systemId = systemId;
    }

    @JsonProperty("job-priority")
    public String getJobPriority() {
        return jobPriority;
    }

    @JsonProperty("job-priority")
    public void setJobPriority(String jobPriority) {
        this.jobPriority = jobPriority;
    }

    @JsonProperty("job-status")
    public String getJobStatus() {
        return jobStatus;
    }

    @JsonProperty("job-status")
    public void setJobStatus(String jobStatus) {
        this.jobStatus = jobStatus;
    }
}

然后我创建了一个包装器类来捕获整个响应:

import com.fasterxml.jackson.annotation.JsonAnyGetter;
import com.fasterxml.jackson.annotation.JsonAnySetter;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;
import java.util.HashMap;
import java.util.Map;

@JsonIgnoreProperties(ignoreUnknown = true)
public class WrapperClass {

    @JsonProperty("job-info")
    private JobInfo jobInfo;

    @JsonProperty("job-info")
    public JobInfo getJobInfo() {
        return jobInfo;
    }

    @JsonProperty("job-info")
    public void setJobInfo(JobInfo jobInfo) {
        this.jobInfo = jobInfo;
    }
}

但是,每当我尝试将响应解析为包装类和/或JobInfo类时,它最终都是空的。这是我进行GET调用并尝试解析的其余代码:

ResponseEntity<String> response = restTemplate.getForEntity(builder.buildAndExpand().toUri(), String.class);
        ObjectMapper mapper = new ObjectMapper();
        try {
            WrapperClass wrapper = mapper.readValue(response.getBody(), WrapperClass.class);
            wrapper.getJobInfo();
        } catch (JsonMappingException e)
        {

        } catch (JsonProcessingException ie) {

        }

有人可以提供一种通过resttemplate和/或jackson来做到这一点的方法吗?

java rest jackson resttemplate
1个回答
0
投票

我必须先指出几件事:

  1. 正如我在原始帖子中评论的那样,该回复无效JSON字符串。(1.1)job-status的值应用双引号引起来。因此,"job-status": Queued"应该为"job-status": "Queued"。(1.2)在某些行的末尾有多余的逗号,使响应JSON字符串无效。
  2. 正如@Scary Wombat所评论的那样,您只是捕获异常而什么也不做。不要那样做!这就是为什么您无法找出发生了什么的原因。

由于响应JSON格式是JSON数组,因此应按如下所示将其反序列化为WrapperClass的列表:

代码段

ObjectMapper mapper = new ObjectMapper();
List<WrapperClass> wrappers = mapper.readValue(jsonStr, new TypeReference<List<WrapperClass>>(){});
wrappers.forEach(e -> {
    System.out.println(e.getJobInfo().toString());
});

控制台输出

JobInfo [jobId = 1,jobName = abc,systemId = 123,jobPriority = 1,jobStatus =已排队]JobInfo [jobId = 2,jobName = abc,systemId = 123,jobPriority = 1,jobStatus =已排队]JobInfo [jobId = 3,jobName = abc,systemId = 123,jobPriority = 1,jobStatus =已排队]

© www.soinside.com 2019 - 2024. All rights reserved.