我正在尝试使用以下结构反序列化json对象:
{"results":{
"Assessments":{
"Assessment":[
{
"assessor":"",
"buildingName":"Emerald Palace Project",
"certBody":"",
...
顶级是名为“results”的单个实体,其中包含“评估”,它们只是“评估”的列表/数组。
我尝试了多种映射器配置组合,例如:
ObjectMapper mapper = new ObjectMapper();
mapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);
mapper.configure(DeserializationConfig.Feature.UNWRAP_ROOT_VALUE, true);
但无论我如何切换它,我都会一直使用null Assessments获得一个Results对象。
以下是使用Lombok的对象类。
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
static class Results {
private Assessments assessments;
}
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
static class Assessments {
private List<Assessment> assessments;
}
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class Assessment {
private int parentId;
private String stage;
private String notes;
private String rating;
private String scheme;
}
我觉得我必须错过一块。
非常感谢任何见解。
答案 0 :(得分:2)
要明确:你写了那个
[...]&#34;评估&#34;这只是&#34;评估的列表/数组。&#34;
并且您的POJO反映了...那么您的JSON必须是......
{"results":{
"Assessments":{
[
{
"assessor":"",
"buildingName":"Emerald Palace Project",
"certBody":"",
...
......而不是......
{"results":{
"Assessments":{
"Assessment":[
{
"assessor":"",
"buildingName":"Emerald Palace Project",
"certBody":"",
...
直接在&#34;评估&#34;中注意列表。 还要注意,您的POJO字段是小写的,因此必须是您的JSON密钥。
因此,要将POJO与JSON匹配,您有多种选择:
@JsonProperty("field-name")
来匹配您的JSON密钥但在每种情况下,您都必须了解有关评估/评估列表的当前冲突。
答案 1 :(得分:0)
因为我必须使用第三方API提供给我的json,所以改变json不是一种选择。
以下是我的工作方式。
首先,我必须更改Assessments对象以获得具有单数名称的列表。 &#34;评估&#34;而不是&#34;评估&#34;因为这就是json响应中拼写的方式。
@Getter
@Setter
@NoArgsConstructor
static class Assessments {
private List<Assessment> assessment;
}
我还设置了我的ObjectMapper以忽略大小写和未知属性。确保使用com.fasterxml.jackson.databind.ObjectMapper。
private static ObjectMapper getJsonMapper() {
ObjectMapper mapper = new ObjectMapper();
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
mapper.configure(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES, true);
return mapper;
}
然而,最大的变化是引入了一个容器类。
@Getter
@Setter
@NoArgsConstructor
private static class JsonContainer {
private Results results;
}
此类是必需的,因为它持有顶级json对象&#34;结果。&#34;
在这些更改到位后,我将Java对象置于我期望的状态。