首页 > 解决方案 > @JsonUnwrapped 将 null 设置为子 pojo 类的值

问题描述

要求:

{
    "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);
}

标签: javajacksonobjectmapper

解决方案


在给定的示例中,对 JSON 的请求没有被包装,因此它的deptandadditionalDetails不应该用@JsonUnwrapped.

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

下面的示例使用 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"
}

推荐阅读