springmvc如何把对象和json相互转换?===完成前后端数据交互json

在上篇《数据转换&数据格式化&参数校验》的文章中介绍了json处理的底层原理问题,原理只是便于理解,主要的还是如何使用?

写一个前后端分析的页面展示,数据写死
先导入fastjsnjar包
配置web.xml和servlet。xml
写一个pojo()
写一个controller去获取数据库数据
写一个list。html用以接收js获取的后端信息(以后看不到jsp都是HTML,通过js去取值再显示给html)
写一个listpage.js用于法ajax请求去获取数据
访问html下的listHTML

》》》所有的前后端交互都是通过发送数据接受数据实现的,而只有json才能实现数据的交互,所以就要解决对象和json的相互转换问题。

1,jackson:
HttpMessageConverter
这个对象是为了将请求参数转换为你想要的的对象,也可以将响应参数转为你想要的的对象。

发送数据
//@ResponseBody//就是声明该方法不走视图解释器,走HttpMessageConverter

1 导入依赖


<dependency>
    <groupId>com.fasterxml.jackson.coregroupId>
    <artifactId>jackson-databindartifactId>
    <version>2.9.8version>
dependency>

2 使用@ResponseBody

@Controller
public class JsonController{    
	@RequestMapping("/test1")
    @ResponseBody //将handler的返回值,转换成json(jackson),并将json响应给客户端。
    public User hello1(){
        System.out.println("hello world");
        User user = new User();
        return user;
    }
    // @ResponseBody还可以用在handler的返回值上
    @RequestMapping("/test2")
    public @ResponseBody List<User> hello2(){
        System.out.println("hello world");
        List<User> users = Arrays.asList(new User(),new User());
        return users;
    }
    // 如果返回值已经是字符串,则不需要转json,直接将字符串响应给客户端 
    @RequestMapping(value="/test3",produces = "text/html;charset=utf-8") //produces 防止中文乱码
    @ResponseBody 
    public String hello2(){
        System.out.println("hello world");
        return "你好";
    }
}

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

@RestController//@Controller+@ResponseBody
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;
    }
}

接收数据
1,使用@RequestBody
一般用于插入数据
@RequestBody, 接收Json参数

1 定义Handler

class User{
    private Integer id;
    private String name;
    private Boolean gender;
    //set get
}

@RequestMapping("/users")
public String addUser(@RequestBody User user){//@RequestBody将请求体中的json数据转换为java对象
    System.out.println("cap2");
    System.out.println("Post user :"+user);
    return "index";
}

2 Ajax发送json(一般如果发的是单个id,就直接发个get请求拼接的形式传给后端,{ url: “user/del?id=”+data.id,};如果发的是一个对象,比如修改是发一个修改的对象,这时就用post请求,以json字符串的形式传给后端)

//ajax
var user = {id:1,name:"shine"};
$.ajax({
 /*  执行过程:前端接收到修改的请求,这时是一个js对象,把js对象传给data,这时把js对象转为
                json字符串并告诉我传的是一个json字符串(不是json对象);后端拿到json字符串因为接受的是一个对象所有
                要用@requestbody转为对象,再进行mvc操作。把处理结果返还给前端的msg*/
    url:'${pageContext.request.contextPath}/json2/test4',
    type:'post',
    contentType:"application/json",//声明请求参数类型为 json
    data:JSON.stringify(user),// 转换js对象成json
    success:function(ret){
        console.log(ret);
    }
});

以上使用的是jackjson完成的,但是要是使用fastjson就要自己配置HttpMessageConverter
因为springmvc整合时没有给Jackjson加HttpMessageConverter这个对象,所有要自己去配,才能象jackjson一样完成数据类型转换为对象。
2,fastjson
1 导入依赖


<dependency>
    <groupId>com.alibabagroupId>
    <artifactId>fastjsonartifactId>
    <version>1.2.54version>
dependency>

2,安装fastjson

<mvc:annotation-driven>
    
    <mvc:message-converters>
        <bean class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter">
            
            <property name="supportedMediaTypes">
                <list>
                    <value>application/jsonvalue>
                list>
            property>
        bean>
    mvc:message-converters>
mvc:annotation-driven>

3 使用

@ResponseBody @RequestBody @RestController 使用方法不变

4 常用注解

  • 日期格式化:@JSONField(format=“yyyy/MM/dd”)
  • 属性名修改:@JSONField(name=“birth”)
  • 忽略属性:@JSONField(serialize = false)
  • 包含null值:@JSONField(serialzeFeatures = SerializerFeature.WriteMapNullValue) 默认会忽略所有null值,有此注解会输出null
    • @JSONField(serialzeFeatures = SerializerFeature.WriteNullStringAsEmpty) null的String输出为""
  • 自定义序列化:@JSONField(serializeUsing = MySerializer2.class)

你可能感兴趣的:(笔记,三大框架)