【问题标题】:@JsonUnwrapped setting null as value for child pojo class@JsonUnwrapped 将 null 设置为子 pojo 类的值
【发布时间】:2021-04-10 12:07:57
【问题描述】:

请求:

{
    "name":"iswarya",
    "dept":{
        "deptName":"eee",
        "location":"firstfloor"
    },
    "additionalDetails":{
        "projectName":"finalyearproject"
    }
}

回复:

{
  "name": "iswarya",
  "deptName": null,
  "location": null,
  "projectName": null
}

控制器类:

@PostMapping(value="/objectMApper")
public String createEmployee(@RequestBody AnnotationTestBean demoEntity) throws JsonProcessingException {
    ObjectMapper obj=new ObjectMapper();
    return obj.writeValueAsString(demoEntity);
}

【问题讨论】:

  • 可以添加AnnotationTestBean 的实现吗?
  • 请提供AnnotationTestBean类结构

标签: java jackson objectmapper


【解决方案1】:

在给定的示例中,对 JSON 的请求未包装,因此其 deptadditionalDetails 不应使用 @JsonUnwrapped 注释。

相反,应该创建一个响应,扩展请求类,具有一个复制构造函数,并覆盖注释为 @JsonUnwrapped 的适当 getter。

下面的示例使用 Lombok 注释来生成 getter/setter/constructors。

@Data
@AllArgsConstructor
@NoArgsConstructor
static class Request {
    private String name;
    
    private Department dept;
    private Details additionalDetails;
}

@Data
static class Department {
    private String deptName;
    private String location;
}

@Data
static class Details {
    private String projectName;
}

static class Response extends Request { 

    public Response(Request request) {
        super(request.name, request.dept, request.additionalDetails);
    }

    @Override @JsonUnwrapped
    public Department getDept() { return super.getDept(); }

    @Override @JsonUnwrapped
    public Details getAdditionalDetails() { return super.getAdditionalDetails(); }
}

测试

ObjectMapper om = new ObjectMapper();

String json = "{\r\n" + 
        "    \"name\":\"iswarya\",\r\n" + 
        "    \"dept\":{\r\n" + 
        "        \"deptName\":\"eee\",\r\n" + 
        "        \"location\":\"firstfloor\"\r\n" + 
        "    },\r\n" + 
        "    \"additionalDetails\":{\r\n" + 
        "        \"projectName\":\"finalyearproject\"\r\n" + 
        "    }\r\n" + 
        "}";

Request request = om.readValue(json, Request.class);

Response response = new Response(request);
String str = om.writerWithDefaultPrettyPrinter().writeValueAsString(response);

System.out.println(str);

输出

{
  "name" : "iswarya",
  "deptName" : "eee",
  "location" : "firstfloor",
  "projectName" : "finalyearproject"
}

【讨论】:

  • 太棒了。非常感谢。还有一个疑问 --> 我们不能在请求 bean 类中使用任何 JSON 注释。因为我尝试了许多 JSON 注释,但它仅设置为 null。如果不能,你能解释一下为什么吗?
  • 在公司的项目实体类中存在@JsonProperty 注释并使用类似于我提到的上述控制器但有其设置值
猜你喜欢
  • 1970-01-01
  • 2018-04-07
  • 2018-10-30
  • 2018-05-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-22
相关资源
最近更新 更多