Json 配置

# Json 配置

# 接收 Json

# @JsonBody

在 Controller 中,我们可以通过给参数添加 @JsonBody 注解来把客户端传入的 Json 数据,转换为我们需要的参数。

# @JsonBody 接收 Bean

我们定义的 Bean 如下:

public class MyBean {    
    private String id;    
    private int age;    
    private BigInteger amount;    
    
    //getter setter
}

示例1:假设前端传入的 Json 数据内容如下:

{  
    "id":"abc",         
    "age":17,         
    "amount":123
 }

在 Controller 中,我们只需要编写如下内容就可以正常接收:

public void bean(@JsonBody() MyBean bean) {    
    System.out.println("bean--->" + bean);    
    renderText("ok");
}

示例2:假设我们接收的 Bean 在 Json 实体里,例如:

{  "aaa":{     
        "bbb":{         
            "id":"abc",         
            "age":17,         
            "amount":123
      }
   }
 }

在 Controller 中,我们只需要编写如下内容就可以正常接收:

public void bean(@JsonBody("aaa.bbb") MyBean bean) {    
    System.out.println("bean--->" + bean);    
    renderText("ok");
}

# @JsonBody 接收 Map

接收 Map 和 Bean 是一样的,只是参数不同。

示例1:假设前端传入的 Json 数据内容如下:

{  
    "id":"abc",         
    "age":17,         
    "amount":123
 }

在 Controller 中,我们只需要编写如下内容就可以正常接收:

public void bean(@JsonBody() Map bean) {    
    System.out.println("bean--->" + bean);    
    renderText("ok");
}

示例2:假设我们接收的 Map 在 Json 实体里,例如:

{  "aaa":{     
        "bbb":{         
            "id":"abc",         
            "age":17,         
            "amount":123
      }
   }
 }

Controller 代码如下:

public void bean(@JsonBody("aaa.bbb") Map bean) {    
    System.out.println("bean--->" + bean);    
    renderText("ok");
}

# @JsonBody 接收 集合(List、Set、Queue、Vector、Stack、Deque 和 数组)

示例1:前端传入的内容如下

[1,2,3]

如下的方法,都可以正常接收数据:

//通过 int[] 数组来接收
public void method1(@JsonBody() int[] beans) {        
     System.out.println("beans--->" + beans);        
     renderText("ok");
} 

 //通过 String[] 数组来接收
public void method2(@JsonBody() String[] beans) {        
    ystem.out.println("beans--->" + beans);        
    enderText("ok");
} 

//通过 List 来接收
public void method3(@JsonBody() List beans) {        
    System.out.println("beans--->" + beans);        
    renderText("ok");
} 
 
//通过 Set 来接收
public void method4(@JsonBody() Set beans) {        
    System.out.println("beans--->" + beans);        
    renderText("ok");
} 
 
//通过 List 指定泛型 Integer 来接收
public void method5(@JsonBody() List<Integer> beans) {        
    System.out.println("beans--->" + beans);        
    renderText("ok");
} 
 
//通过 Set 指定泛型 Integer 来接收
public void method6(@JsonBody() Set<Integer> beans) {        
    System.out.println("beans--->" + beans);        
    renderText("ok");
} 
 
 //通过 List 指定泛型 String 来接收
public void method7(@JsonBody() List<String> beans) {        
    System.out.println("beans--->" + beans);        
    renderText("ok");
} 
 
 //通过 Set 指定泛型 String 来接收
public void method8(@JsonBody() Set<String> beans) {        
    System.out.println("beans--->" + beans);        
    renderText("ok");
}

当然,我们可以把 List 或者 Set 修改为 Queue、Vector、Stack、Deque 等其他数据类型。

如果我们要接收的数组包括在 Json 实体里,例如:

{  
"aaa":{      
        "bbb":[1,2,3]
      }
}

只需要在 @JsonBody 添加对应的前缀即可,比如:

public void method1(@JsonBody("aaa.bbb") int[] beans) {        
     System.out.println("beans--->" + beans);        
     renderText("ok");
}

示例2,接收 Bean 数组:

比如前端传入的是:

{    
"aaa":{        
    "bbb":[
            {                
            "id":"abc",                
            "age":17,                
            "amount":123
            },
            {                
            "id":"abc",                
            "age":17,                
            "amount":123
            }
        ]
    }
}

Controller 的代码如下:

public void list(@JsonBody("aaa.bbb") List<MyBean> list) {        
      System.out.println("list--->" + list);        
      renderText("ok");
  }

或者

public void set(@JsonBody("aaa.bbb") Set<MyBean beans) {        
    System.out.println("array--->" + beans);        
    renderText("ok");
}

或者

public void array(@JsonBody("aaa.bbb") MyBean[] beans) {        
    System.out.println("array--->" + beans);        
    renderText("ok");
}

# 通过 @JsonBody 接收基本数据

假设客户端(前端)传入的数据内容如下,我们想获取 id 的值。

{  "aaa":{     
        "bbb":{         
            "id":"abc",         
            "age":17,         
            "amount":123
      }
   }
 }

Controller 代码如下:

 public void id(@JsonBody("aaa.bbb.id") String id) {        
      System.out.println("id--->" + id);        
      renderText("ok");
  }

或者我们接收 age 参数,内容 Controller 代码如下:

public void age(@JsonBody("aaa.bbb.age") int age) {        
      System.out.println("age--->" + age);        
      renderText("ok");
  }

此处要注意,因为 age 在方法中定义的是 int 类型,当前端没有传入任何值得时候,age 得到的值为: 0。所以,如果我们想接收基本数据类型的值,建议定义为其封装类型,比如 int 定义为 Integer,long 定位为 Long 等。

# @JsonBody 高级特性:自动拆装

示例1:假设前端传入的内容如下:

{    
"aaa":{        
    "bbb":[
            {                
            "id":"abc",                
            "age":17,                
            "amount":123
            },
            {                
            "id":"abc",                
            "age":17,                
            "amount":123
            }
        ]
    }
}

我们想接收到所有 id 值,并自动转换为一个 String[] 数组、或者 List<String>等类型,接收代码如下:

public void array(@JsonBody("aaa.bbb[id]") String[] ids) {        
    System.out.println("array--->" + ids);        
    renderText("ok");
}

或者

public void array(@JsonBody("aaa.bbb[id]") List<String> ids) {        
    System.out.println("array--->" + ids);        
    renderText("ok");
}

示例2,如果我们想获取数组里的某个值,比如前端传入的数据内容如下:

{    
"aaa":{        
    "bbb":[
            {                
            "id":"abc",                
            "age":17,                
            "amount":123
            },
            {                
            "id":"abc",                
            "age":17,                
            "amount":123
            }
        ]
    }
}

我们想获取 第一个 age 的值,接收数据内容如下:

public void age(@JsonBody("aaa.bbb[0].age") long age) {
    renderText("intInArray--->" + age);
}

示例3: 假设前度传入的 Json 内容如下:

{
    "aaa":{
        "bbb":[
            {
                "attr1":"abc",
                "beans":[
                    {
                        "id":"abc",
                        "age":17,
                        "amount":123
                    },
                    {
                        "id":"abc",
                        "age":17,
                        "amount":123
                    }
                ]
            },
            {
                "attr2":"abc"
            }
        ]
    }
}

我们想获取 beans 的值,Controller 内容如下:

public void array(@JsonBody("aaa.bbb[0].beans") MyBean[] beans) {
    System.out.println("array--->" + JsonKit.toJson(beans));
    renderText("ok");
}

如果我们想获取 beans 下的所有 id 值,Controller 内容如下:

public void array(@JsonBody("aaa.bbb[0].beans[id]") String[] ids) {
    System.out.println("array--->" + JsonKit.toJson(ids));
    renderText("ok");
}

# 直接通过 Controller 接收 Json

在 Controller 中,我们如果不通过 @JsonBody 接收 Json 数据,也是没问题的。

例如:前端传入的 Json 内容如下:

{
    "aaa":{
        "bbb":[
            {
                "attr1":"abc",
                "beans":[
                    {
                        "id":"abc",
                        "age":17,
                        "amount":123
                    },
                    {
                        "id":"abc",
                        "age":17,
                        "amount":123
                    }
                ]
            },
            {
                "attr2":"abc"
            }
        ]
    }
}

我们想获取 beans 的值,Controller 内容如下:

public void array() {
    MyBean[] beans = getRawObject(MyBean[].class,"aaa.bbb[0].beans");
    System.out.println("array--->" + JsonKit.toJson(beans));
    renderText("ok");
}

此处要注意,如果我们想获取一个泛型 List<MyBean>,需要使用如下方法:

public void array() {
    List<MyBean> beans = getRawObject(new TypeDef<List<MyBean>>(){},"aaa.bbb[0].beans");
    System.out.println("array--->" + JsonKit.toJson(beans));
    renderText("ok");
}

或者

public void array() {
    Set<MyBean> beans = getRawObject(new TypeDef<Set<MyBean>>(){},"aaa.bbb[0].beans");
    System.out.println("array--->" + JsonKit.toJson(beans));
    renderText("ok");
}

如果我们想获取 beans 下的所有 id 值,Controller 内容如下:

public void array(@JsonBody() {
    String[] ids = getRawObject(String[].class,"aaa.bbb[0].beans[id]");
    System.out.println("array--->" + JsonKit.toJson(ids));
    renderText("ok");
}

或者

public void array() {
    List<Strint> ids = getRawObject(new TypeDef<List<String>>(){},"aaa.bbb[0].beans[id]");
    System.out.println("array--->" + JsonKit.toJson(ids));
    renderText("ok");
}

或者

public void array() {
    Set<Strint> ids = getRawObject(new TypeDef<Set<String>>(){},"aaa.bbb[0].beans[id]");
    System.out.println("array--->" + JsonKit.toJson(ids));
    renderText("ok");
}

# 输出 Json

# jboot v3.5.1(包括 3.5.1) 之后的配置

#是否启用大写转换,比如 user_age 自动转为为 UserAge,只对 Model 生效,默认值为 true
jboot.json.camelCaseJsonStyleEnable = true

#是否转换任何地方,比如 map.put("my_field") 默认输出为 myField,默认值为 false
jboot.json.camelCaseToLowerCaseAnyway = false

#是否跳过 null 值输出,map.put("key",null),则 key 值不输,默认值为 true
jboot.json.skipNullValueField = true

#配置输出的时间格式,默认值为 yyyy-MM-dd HH:mm:ss
jboot.json.timestampPattern = "yyyy-MM-dd HH:mm:ss"

# 是否跳过 model 的 attr,只用 bean 的 getter 来渲染
jboot.json.skipModelAttrs = false

# 是否值跳过 bean 的 getter,只用 model 的 attr 渲染
jboot.json.skipBeanGetters =false

# jboot v3.5.1 之前的配置

#是否启用大写转换,比如 user_age 自动转为为 UserAge
jboot.web.camelCaseJsonStyleEnable = true

#是否转换任何地方,比如 map.put("my_field") 默认输出为 myField
jboot.web.camelCaseToLowerCaseAnyway = false

#配置输出的时间格式
jboot.web.jsonTimestampPattern

# 通过 Java 代码配置

更多的配置可以通过 JFinalJsonKit 工具类来进行配置。

# 其他

  • 1、通过 @JsonIgnore 注解可以忽略某个字段,比如
public class User{
    
    @JsonIgnore
    public String getPassword(){
        return Supper.getPassword();
    }
}

以上代码可以忽略 password 的输出。

  • 2、支持 FastJson 的 JsonField 的配置
public class User {

    @JSONField(name = "sex")
    public String getSexString(){
         return "男";
    }
}

输出字段又 sexString 重新修改为 sex