1. 介绍

介绍如何在gb项目中使用json,输出json,domain转换为json.

2. 使用

因为spring boot内置jacksonjson类库作为json的处理类库, 所以所有的json操作包括MVC的输入@Responsebody的处理都是使用如下的代码:

//读取json至对象中
 new ObjectMapper().readValue("{name:'abc',age:30}",Map.class)
 //将对象写为json字符串
 new ObjectMapper().writeValueAsString(obj)

一般问题出现在对象写为字符串的过程,因为domain类对象间的引用和安全考虑, 需要进行定制化的操作,以免出现递归调用或安全隐患.

2.1. domain类定制类型json输出

2.1.1. 对象类型的格式化输出,如Date类型

@Entity
class SystemLoginRecord {
    @JsonFormat(pattern = "yyyy-MM-dd",timezone="GMT+8")
    Date loginTime
    .....
}

2.1.2. 有些属性无需输出, 如password属性

@Entity
@JsonIgnoreProperties(["errors", "metaClass", "dirty", "attached","password"])
class SystemLoginRecord {
    .....
}

2.2. 解耦domian类的外键对象json输出

2.2.1. 使用JsonSerialize注解

使用@JsonSerialize(using=GbDomainSimpleJsonSerializer.class)注解来指 明domain类的外键对象json规则,默认生成id,label,class三个属性(序列id、显示label,class类名)

@Entity
class SystemLoginRecord {
    @JsonSerialize(using=GbDomainSimpleJsonSerializer.class)
    BaseUser baseUser
    ......
}

2.2.2. 配合@GbDomainSimpleJsonFormat注解

使用@GbDomainSimpleJsonFormat注解配合JsonSerialize来定制化domain类的外键对象json规则, 支持values和ignores两种字段设置方式

@Entity
class SystemLoginRecord {
    @JsonSerialize(using=GbDomainSimpleJsonSerializer.class)
    @GbDomainSimpleJsonFormat(ignores=['version','dateCreated','lastUpdated','password'])
    //@GbDomainSimpleJsonFormat(values=['id','username','enabled'])
    BaseUser baseUser
    ......
}

2.3. json view 的使用

当领域类需要在多种不同场景下序列化为json时, 如用于通讯录的用户列表和用于管理台的用户列表就不尽相同. 如密码,启用等属性应该只显示在后者的序列化json里.这时就需要使用jsonview注解来解决问题了.

2.3.1. 定义视图接口

如在BaseUser类中定义两个json view 接口 UserSimpleView和UserDetailView

@Entity
class BaseUser {
    public interface UserSimpleView{};                            (1)
    public interface UserDetailView extends UserSimpleView{};     (2)
    ......
}

2.3.2. 在领域类标注

@Entity
class BaseUser {
    public interface UserSimpleView{};
    public interface UserDetailView extends UserSimpleView{};
    @JsonView(UserSimpleView.class)         (1)
    @Title(zh_CN="用户名")
    String username
    @JsonView(UserDetailView.class)        (2)
    @Title(zh_CN="密码")
    String password
    @JsonView(UserDetailView.class)        (3)
    @Title(zh_CN="启用")
    boolean enabled = true
    @JsonView(UserSimpleView.class)        (4)
    @JsonFormat(pattern = "yyyy-MM-dd",timezone="GMT+8")
    @Title(zh_CN='创建日期')
    Date dateCreated
}

2.3.3. 在控制类标注

@GbController
class SampleController {
    @ResponseBody
    @JsonView([BaseUser.UserSimpleView])
    public List simple(){
        return BaseUser.list()
    }
    @ResponseBody
    @JsonView([BaseUser.UserDetailView])
    public List detail(){
        return BaseUser.list()
    }
}

2.3.4. 测试

编写测试代码检验