ajax返回object转json字符串,controller层接收json字符串,并转为对象

本文详细介绍了在Java后端使用JPA时,如何处理JSON序列化与反序列化的问题,包括单个对象、对象集合以及复杂对象的处理。通过@JsonIgnore和@JsonProperty注解来控制字段的序列化和反序列化,并提供了防止嵌套序列化的方法。同时,提到了Jackson和FastJson的配合使用以及日期格式的初始化。最后,文章还展示了如何接收和处理JSON传递的单一参数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值