controller层接收json字符串,并转为对象

1、entity类

public class Report{
    private Long id;

    private String name;

    @JSONField(serialize = false)
    @JsonIgnore
    @OneToOne()
    @JoinColumn(name = "maintenance_task_id", referencedColumnName = "id")
    private Task task;
}
public class Task{
    private Long id;

    private String name;

    @JSONField(serialize = false)
    @JsonIgnore
    @OneToOne(MappedBy="task")
    private Report report;
}

接收单个对象转成的字符串

json字符串(ajax 中添加 Content-Type:application/json)

    {"id":1,"name":"aaa"}

后台接收

    @PostMapping("/test")
    public Object save(@RequestBody Report report){
        report=Rep.report().save(report);
        return report;
    }

2、接收对象集合转成的字符串

json字符串(ajax 中添加 Content-Type:application/json)

    [{"id":1,"name":"aaa"},{"id":2,"name":"ccc"}]

后台接收

    @PostMapping("/test")
    public Object save(@RequestBody List reportList){
        reportList=Rep.report().saveAll(reportList);
        return reportList;
    }

3、复杂对象

json字符串(ajax 中添加 Content-Type:application/json,去掉@JsonIgnore)

{"task":{"id":1,"name":"bbb"},"id":1,"name":"aaa"}

后台接收

    @PostMapping("/test")
    public Object save(@RequestBody Report report){
        report=Rep.report().save(report);
        return reportList;
    }

4、解决复杂对象json序列化时的嵌套问题

方案1:getter上使用@JsonIgnore,setter上使用@JsonProperty

public class Report{
    private Long id;

    private String name;

    @JSONField(serialize = false)
    @OneToOne()
    @JoinColumn(name = "maintenance_task_id", referencedColumnName = "id")
    private Task task;

    @JsonIgnore
    public Task getTask() {
        return task;
    }

    @JsonProperty
    public void setTask(Task task) {
        this.task = task;
    }
}

方案2:属性上使用@JsonProperty(access = JsonProperty.Access.WRITE_ONLY) 表示序列化或反序列化时,该属性只写入。

@Getter
@Setter
public class Report{
    private Long id;

    private String name;

    @JSONField(serialize = false)
    @JsonProperty(access = JsonProperty.Access.WRITE_ONLY) 
    @OneToOne()
    @JoinColumn(name = "maintenance_task_id", referencedColumnName = "id")
    private Task task;
}

5、jpa中,Jackson和FastJson的配合使用

jackson只读不序列化,fastjson不序列化,如需将复杂对象序列化,需要手动转换成map+list,再序列化。

6、controller中初始化时间格式

    //初始化字符串时间为date时间
    @InitBinder
    public void initBinder(WebDataBinder binder, WebRequest request) {
        //转换日期 注意这里的转化要和传进来的字符串的格式一致 如2015-9-9 就应该为yyyy-MM-dd
        DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, true));// CustomDateEditor为自定义日期编辑器
    }

注意:Content-Type:application/json;@RequestBody 注解;@JsonIgnore注解;@JsonProperty注解;@JsonProperty(access = JsonProperty.Access.WRITE_ONLY) ;集合json字符串的格式

7、补充:json传递单参数让后台获取

json不需要什么格式,直接就是一个数字或字符串:

    18

后台获取:

    @RequestMapping("/test")
    public void test(@RequestBody Integer age) {
        System.out.println("age : " + age);//age这时候等于18
    }

你可能感兴趣的:(controller层接收json字符串,并转为对象)