json 使用小结
此篇仅仅为我遇到的问题。
环境SpringBoot 2.1.7
首先需要知道的是Springboot 默认使用的是Jackson,即使没有配置,@ResponseBody 即可。但是后期我发现,可以先导入 fastJson ,如果转换有问题的话,直接调用fastJson 即可看到问题。注意的是,会把null删除。
在此我罗列了几点使用
-
前端传输问题
-
后端接收数据问题
-
回传问题
-
如何判断自己哪里错了
- dubug查看自己能否在后端接受
- 500,可以先用fastJson进行转换,看看转换的数据问题,我就遇到了全为空,
- 查看前端回传的XHR
(以下代码很不全,只需要看核心即可。)
其实很多500问题,都需要调dubug去做,前端的代码问题很少,一般都是后端的问题
先写几个注意点
-
前端发送设置
contentType: "application/json; charset=UTF-8",
这个utf-8 有争议,会出现WARN。这样的get post都能穿,我在这里效果确实实现了,但是继续改进好像吧utf-8去掉就可以了。
-
后端使用@Resquest 接受对象或者参数
public ResultModel checkLogin(HttpServletRequest request, @RequestBody User user)
-
利用map进行存储时,不能
Map<String,Object> hashMap=new HashMap<>();
Object ,这里就要说一个问题。Object是访问不到对象的get等自定义的方法的。
必须为对象
Map<String,User> hashMap=new HashMap<>();
其实这边直接返回也可以了,但是我容易忽略一点,一开始就是回传成功的。是因为我在User上使用了@Data,但是下面DTO没有加。toJsonString 是依赖这些get 方法去获得属性值的。
-
使用DTO进行封装
使用DTO时候,用到了另一个Enum,下面再贴代码好了。
DTO,保证回传。
-
后端返回 如果是String ,其实就是在外面嵌套了一个 “” ,所以有些地方是统一String返回(先用fastJson.toJsonSting(ResultDTO)这是我看到有人是这么写的。。。。似乎也没错),
还有就是我将@Controller 和@ResponseBody 分开写了,如果愿意的话,@RestController 即可。
-
前端接收
success(res)的问题而已,网上很多。
前端问题和后端接收
前端的话我用的是Jquery去实现。
题外对比 那么第一种是 serialize()
<script>
$('form').submit(function () {
layer.msg('wocao',{time:2000});
var username=$("input[name='username']").val();
if(username==null){
layer.msg('用户名不能为空!',{time:2000});
return false;
}
var password=$("input[name='password']").val();
var url=$(this).attr('action');
var formData=$("#form").serialize();
$.ajax({
type: "post",
url: url,
dataType: "json",
data: formData,
success: function(hashmap){
if (hashmap.status == 1) {
layer.msg(hashmap.message, {time: 1000}, function () {
// window.location.href = "/admin/user_list/lists";
// layer.msg(.message);
window.location.href="/demo/success";
});
} else {
//刷新验证码
// $(".reloadverify").click();
layer.msg(hashmap.message);
}
}
});
return false;
});
</script>
那么接收其实用不到@ResquestBody
public String checkLogin(HttpServletRequest request,String username,String password){}
直接对应属性接受即可。
json格式发送与接收
<script>
$('form').submit(function () {
layer.msg('wocao',{time:2000});
var username=$("input[name='username']").val();
if(username==null){
layer.msg('用户名不能为空!',{time:2000});
return false;
}
var password=$("input[name='password']").val();
var url=$(this).attr('action');
var formData=$("#form").serialize();
$.ajax({
type: "post",
url: url,
contentType: "application/json; charset=UTF-8",
dataType: "json",
data: JSON.stringify({
userName: username,
password: password
}),
success: function(res){
if (res.code == "002") {
layer.msg(res.msg, {time: 1000}, function () {
// window.location.href = "/admin/user_list/lists";
// layer.msg(.message);
window.location.href="/demo/success";
});
} else {
//刷新验证码
// $(".reloadverify").click();
layer.msg(res.msg);
}
},error:function(xhr){alert(xhr.responseText)}
});
return false;
});
</script>
后端接收利用@ResquestBody
@ResponseBody//直接返回json 值
@PostMapping("/checkLogin")
public ResultModel checkLogin(HttpServletRequest request, @RequestBody User user){
String password= user.getPassword();
Map<String,User> hashMap=new HashMap<>();
boolean result=password.equals(userService.getUser(Integer.parseInt(user.getUserName())).getPassword());
if (result) {
request.getSession().setAttribute("admin_id",user.getUserName());
// hashMap.put("status",1);
// hashMap.put("message","登陆成功");
hashMap.put("user",user);
// return JSON.toJSONString(hashMap);
return (new ResultModel<Map<String ,User>>().setSuccess(hashMap));
// String res=JSON.toJSONString(hashMap);
// return res;
}
else {
System.out.println(123);
// return JSON.toJSONString(new ResultModel<Map<String ,Object >>().setError(null));
return new ResultModel<Map<String ,Object >>().setError(null);
}
}
Springboot No converter found for return value of type: class
这个提示我是从前端回传看到的。。。但是我看不少人从后端看到的
Spring 都自带了jackson,所以一般是get方法没写,建议直接用@Data算了