天天看点

SpringMVC中json数据传输

8.SpringMVC中json数据传输

8.1 什么是json?

  • JSON (JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式。
  • 它基于 ECMAScript(欧洲计算机协会制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。

8.2 json与JavaScript关系

  • JSON 是 JS 对象的字符串表示法,它使用文本表示一个 JS 对象的信息,本质是一个字符串。
  • JSON 和 JS 对象互转

要实现从JSON字符串转换为JS对象,使用 JSON.parse() 方法:

var obj = JSON.parse('{"a": "Hello", "b": "World"}'); //结果是 {a: 'Hello', b: 'World'}
           

要实现从JS对象转换为JSON字符串,使用 JSON.stringify() 方法:

var json = JSON.stringify({a: 'Hello', b: 'World'}); //结果是 '{"a": "Hello", "b": "World"}'
           
  • 任何支持的类型都可以通过 JSON 来表示,例如字符串、数字、对象、数组等。但是对象和数组是比较特殊且常用的两种类型。
    • 表示对象
    • 表示数组
    • { 
      "people":[ 
      {
      "firstName": "Brett",      
      "lastName":"McLaughlin"    
      },   
      {    
      "firstName":"Jason",
      "lastName":"Hunter"
      }
      ]
      }
      这不难理解。在这个示例中,只有一个名为 people的变量,值是包含两个条目的数组,每个条目是一个人的记录,其中包含名和姓。上面的示例演示如何用括号将记录组合成一个值。当然,可以使用相同的语法表示更过多的值(每个值包含多个记录)。
                 

8.3 Json转化器Jackson和FastJson

8.3.1 Jackson

<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.11.1</version>
</dependency>
           

JSON转为Java对象

  1. 导入jackson的相关jar包(依赖)
  2. 创建Jackson核心对象 ObjectMapper ObjectMapper mapper = new ObjectMapper();
  3. 调用ObjectMapper的相关方法进行转换
    readValue(json字符串数据,Class)

Java对象转换JSON

  1. 使用步骤:导入jackson的相关依赖
  2. 创建Jackson核心对象 ObjectMapper ObjectMapper mapper = new ObjectMapper();
  3. 调用ObjectMapper的相关方法进行转换 mapper.writeValue(response.getWriter(),map);

转换方法

writeValue(参数1,obj):

参数1:

File:将obj对象转换为JSON字符串,并保存到指定的文件中

Writer:将obj对象转换为JSON字符串,并将json数据填充到字符输出流中

OutputStream:将obj对象转换为JSON字符串,并将json数据填充到字节输出流中

writeValueAsString(obj):将对象转为json字符串

readValue(String json,Class aclass);将json字符串转为对象

8.3.2 FastJson

fastjson依赖

<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.72</version>
</dependency>
           

测试代码

@RequestMapping("/xuan2")
public String testJson2(ServletResponse response) throws JsonProcessingException {

    //json对象
    User user1 = new User("郑楷",50,"女");
    User user2= new User("黄文",20,"女");
    User user3 = new User("杨深",80,"女");
    User user4 = new User("沙嗲",3,"女");
    User user5 = new User("郑楷",17,"女");

    Map<Integer,User> map =new HashMap();
    map.put(1,user1);
    map.put(2,user2);
    map.put(3,user3);
    map.put(4,user4);
    map.put(5,user5);

    return JSON.toJSONString(map);
}
           

JSON方法

SpringMVC中json数据传输

8.4 编写测试

​ 第一步:编写controller层代码
  • 这里的@[email protected][email protected]
package com.xuan.controller;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.xuan.pojo.User;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.ServletResponse;

@RestController
public class JsonController {


    @RequestMapping("/xuan")
    public String testJson(ServletResponse response) throws JsonProcessingException {

        //json对象
        ObjectMapper mapper = new ObjectMapper();

        User user = new User();
        user.setName("郑泽楷");
        user.setAge(58);
        user.setGender("女");

        String string = mapper.writeValueAsString(user);

        return string;
    }
}
           
​ 第二步:编写关键配置文件
  • 下面是解决json乱码问题的关键配置
<!--json乱码问题配置-->
<mvc:annotation-driven>
    <mvc:message-converters register-defaults="true">
        <bean class="org.springframework.http.converter.StringHttpMessageConverter">
            <constructor-arg value="UTF-8"/>
        </bean>
        <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
            <property name="objectMapper">
                <bean class="org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean">
                    <property name="failOnEmptyBeans" value="true"/>
                </bean>
            </property>
        </bean>
    </mvc:message-converters>
</mvc:annotation-driven>
           
​ 第三步:做测试根据自己的路径