3.3 json
上一节的登录回复的json比较复杂,而实际上不会手动的方式去编辑json,因为太容易出错了,这一节介绍一个json生成工具fastjson
首先在pom.xml中加入下面的依赖:
<dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.74</version></dependency>
上一节的登录成功的json如下:
{ "code":"200", "info":"", "data":{ "course":"1", "user":{ "username":"abc", "role":"9", "nickname":"java", "createDate":"2020-09-16 16:44:32", "isValid":"1", "wxOpenid":"otByv5rZF8zHch3HI5FVZ5dCw8CY" }, "url":"main" }}
如果用fastjson来构建,那么就是这样的,最后的result就是字符串类型的json格式数据:
JSONObject data=new JSONObject();data.put("course",1);//这里user就是从数据库里查找到的对象data.put("user",user);data.put("url","main");JSONObject js=new JSONObject();js.put("code",200);js.put("info","");js.put("data",data);String result=js.toString();
user对象直接可以转换成json字符串,很方便,但这里还有一个问题:密码不能包含,这里只需要修改一下User类就可以了,把这个标注@JsonIgnore和@JSONField(serialize = false)放在password属性上方,如下方代码所示:
import com.alibaba.fastjson.annotation.JSONField;import com.fasterxml.jackson.annotation.JsonIgnore;import javax.persistence.*;@Entity public class User{ private String username; @JsonIgnore @JSONField(serialize=false) private String password; private String role; private String nickname; private String createDate; private String isValid; /** 其他代码省略* */ }
这样所有的User对象直接生成json字符串的时候,都会忽略掉password这个属性。
由于整个学习平台的后台返回形式都是code,info以及data的json,为了方便起见,直接创建一个类来封装这三个消息:
/** * 通用的json模型 */public class CommonMessage{ private String code; private String info; private Object data; public CommonMessage(){ } public CommonMessage(String code,String info){ this.code=code; this.info=info; } public CommonMessage(String code){ this.code=code; } public String getCode(){ return code; } public void setCode(String code){ this.code=code; } public String getInfo(){ return info; } public void setInfo(String info){ this.info=info; } public Object getData(){ return data; } public void setData(Object data){ this.data=data; }}
类似这样使用CommonMessage,作为controller函数的返回类型,Springboot会自动把对象转换成json:
@GetMapping("/test")public CommonMessage test(){ CommonMessage message=new CommonMessage(); message.setCode("200"); message.setInfo("测试"); User user=new User(); user.setNickname("java"); user.setPassword("123456"); user.setUsername("username"); user.setCreateDate(Common.now()); user.setWxOpenid("wxOpenid"); message.setData(user); return message;}
使用fastjson和CommonMessage类,重写上一节的登录。