Json处理

1.导入依赖

<!-- Jackson springMVC默认的Json解决方案选择是 Jackson,所以只需要导入jackson的jar,即可使用。-->
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.9.8</version>
</dependency>

2.使用@ResponseBody

@Controller
public class HelloController {

    @RequestMapping("/getOne")
    @ResponseBody  //将handler的返回值,转换成json(jackson),并将json响应给客户端。
    public User getOne(Integer id){
        System.out.println(id);
        User user = new User();

        user.setId(id);
        user.setName("张三");
        user.setAge(18);
        user.setGender("男");

        return user;
    }

    @RequestMapping("/getAll")
    @ResponseBody
    public List<User> getAll(){
        User user = new User();

        user.setId(1);
        user.setName("张三");
        user.setAge(18);
        user.setGender("男");

        User user1 = new User();

        user1.setId(2);
        user1.setName("李四");
        user1.setAge(19);
        user1.setGender("男");



        User user2 = new User();

        user2.setId(3);
        user2.setName("王五");
        user2.setAge(20);
        user2.setGender("男");

        List<User> users = new ArrayList<>();
        users.add(user);
        users.add(user1);
        users.add(user2);
        return users;
    }
}

 

 

3.使用@RestController

Controller类上加了@RestController注解,等价于在类中的每个方法上都加了@ResponseBody

@Controller
@RestController
public class JsonController{
    @RequestMapping("/test1")
    public User hello1(){
        System.out.println("hello world");
        User user = new User();
        return user;
    }
    //@ResponseBody还可以用在handler的返回值上
    @RequestMapping("/test2")
    public List<User> hello2(){
        System.out.println("hello world");
        List<User> users = Arrays.asList(new User(),new User());
        return users;
    }
}

4.使用@RequestBody

@RequestBody, 接收Json参数

定义Handler

class User{
    private Integer id;
    private String name;
    private Integer age;
    private String gender;
    //set get
}
@RequestMapping("/test5")
    public User test5(@RequestBody User user){
        System.out.println(user);
        return user;
    }

Ajax发送json   jsp  Ajax

  function test5(){
            var obj={"id1":1,"name":"","age":3,"gender":"男","birth":"2020-05-07  10:01:10"};
            $.ajax({
                url:"test5",
                type:"post",
                contentType:"application/json",
                //JSON.stringify 将对象转为json字符串
                data:JSON.stringify(obj),
                success:function(res){
                    console.log(res);
                }
            })
        }
1.如果我们的content-type 是application/x-www-form-urlencoded  参数是json对象 则后端正常接收参数


 2.如果我们的content-type 是application/x-www-form-urlencoded   参数是json字符串 后端如果直接获取参数  无法获得值 
  
   如果我们的content-type 是application/x-www-form-urlencoded 参数是json字符串后端加@RequestBody 则抛出415异常

 3.如果我们的content-type 是application/json   参数是json对象    后端正常接收 无法获得参数值
   如果我们的content-type 是application/json 参数是json对象       后端@RequestBody 抛出400异常     
                                      
 4.如果我们的content-type 是application/json   参数是json字符串  后端正常接收  无法获得参数值
  如果我们的content-type 是application/json 参数是json字符串     后端@RequestBody 获得值成功                                                 

contentType:"application/json"   加上这句话会将下图的content-type改为application/json

@RequestBody将请求体中的json数据转换为java对象

 

5.Jackson常用注解

日期格式化

1.@DateTimeFormat注解  这个注解在实体类birth上,  上述不管是加不加contentType:"application/json",都可以执行

 

2.@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")注解,这个只能用于contentType:"application/json"格式。

属性名修改

@JsonProperty("new_name")

public class User{
	@JsonProperty("new_id") //不再使用原属性名,而是 "new_id"
    private Integer id;
	private String name;
    ....
    get/set
}
输出的json:{“new_id”:xx,"name":"xx"}

自定义序列化

@JsonSerialize(using = MySerializer.class) // 使用MySerializer输出某属性

 

public class MySeriabler extends JsonSerializer<Double> {//自定义序列化器
    @Override
    public void serialize(Double value, JsonGenerator gen, SerializerProvider serializers) throws IOException {

        // 将double 值转为 BigDecimal  保留小数点后两位 (四舍五入) 转String
        String s = BigDecimal.valueOf(value).setScale(2, RoundingMode.HALF_UP).toString();

        gen.writeNumber(s);

    }
}

小数点四舍五入

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值