我正在尝试将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来做到这一点的方法吗?
我必须先指出几件事:
job-status
的值应用双引号引起来。因此,"job-status": Queued"
应该为"job-status": "Queued"
。(1.2)在某些行的末尾有多余的逗号,使响应JSON字符串无效。由于响应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 =已排队]