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类,重写上一节的登录。