如果要使用前后端分离的模式,JSON作为数据交互的载体是必然的, 简单直接,虽然protobuf什么的效率更高,但是操作性就复杂多了
所以,记录下JSON交互中遇到的坑
接收JSON数据
$.ajax({
type:"POST",
url:"/rest/user",
dataType:"json",
contentType:"application/json",
data:JSON.stringify(saveData),
success:function(data){
}
});
如果是看了我的JWT的博客, 关于携带Token进行Ajax操作,也进行了一些封装 Github 源码
Java类
// 类上的注解
@RestController
@RequestMapping("/rest/user")
// 实现方法
@PostMapping(produces="application/json;charset=UTF-8")
public String save(@RequestBody College college) {
log.info(college.toString());
return collegeService.saveOne(college);
}
返回JSON数据
两种方式:
1. 类上使用 RestController 注解
2. 方法上注明 ResponseBody注解
SpringBoot中的SpringMVC默认使用Jackson进行解析
但是,神坑出现了, Jackson Gson 都不会返回标准JSON!!! 对于数值类型不会用双引号包住,而且null也是一样
但是可以通过配置搞定 无奈,自己写了工具类
public class JsonBuilder {
private static Logger log = LoggerFactory.getLogger(JsonBuilder.class);
private static ObjectMapper mapper = new ObjectMapper();
private static ResultVO resultVO = new ResultVO();
static {
mapper.configure(JsonGenerator.Feature.WRITE_NUMBERS_AS_STRINGS, true);
}
public static String buildSuccessResult(String msg, Object data){
return buildResult(0, msg, data);
}
public static String buildResult(Integer code, String msg, Object data){
code = checkInteger(code);
try {
return cleanNull(mapper.writeValueAsString(resultVO.setCode(code).setMsg(msg).setData(data)));
} catch (JsonProcessingException e) {
log.error(" Create JSON Failed ", e);
return "{\"code\":\"1\", \"msg\":\"error\", \"data\":\" \"}";
}
}
private static Integer checkInteger(Integer target){
if(target == null){
return 0;
}else{
return target;
}
}
private static String cleanNull(String target){
return target.replace("[^\"]null", "\"null\"");
}
}