zoukankan      html  css  js  c++  java
  • SpringMVC-07-JSON讲解

    7. JSON讲解

    前后端分离时代:

    后端部署后端,提供接口,提供数据;

    前端独立部署,负责渲染后端的数据;

    json诞生,作为前后端传递的格式!

    什么是JSON?

    • JSON(Javascript Object Notation,JS对象标记),轻量级的数据交换格式;
    • 采用完全独立于编程语言的文本格式来存储和表示数据;
    • 简洁清晰的层次结构
    • 易于人阅读和编写,也易于机器解析和生成;

    在JavaScript语言中,一切都是对象。因此,任何JavaScript支持的类型都可以通过JSON来表示。

    要求和语法格式:

    • 对象表示为键值对,数据由括号分隔
    • 花括号保存对象
    • 方括号保存数组

    JSON键值对是用来保存JavaScript对象的一种方式,用双引号包裹,使用冒号分隔。

    JSON和JavaScript对象的关系:

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

      var obj={a:'hello',b:'world'};
      var json='{a:"hello",b:"world"}'
      

    JSON和JS对象的互转

    • JSON-->JS对象,JSON.parse()方法;

      var obj = JSON.parse(json);
      
    • JS对象-->JSON,JSON.stringify()方法;

      var json = JSON.stringify(user);
      

    代码测试步骤:

    1. 新建一个module,springmvc-05-json,添加web支持

    2. 在web目录下新建一个jsontest.html

      <!DOCTYPE html>
      <html lang="en">
      <head>
          <meta charset="UTF-8">
          <title>Title</title>
          <script type="text/javascript">
              //编写一个js对象 ES6支持let定义对象
              var user={
                  name:"huba",
                  age:3,
                  sex:"男"
              }
              //js对象转化为json对象
              var json = JSON.stringify(user);
              console.log(json);
              //console.log(user);
              //json转化为js对象
              var obj = JSON.parse(json);
              console.log("========= ")
              console.log(obj);
          </script>
      </head>
      <body>
      
      </body>
      </html>
      

    Controller返回JSON数据

    • Jackson是目前比较好的json解析工具

    • 首先需要导入它的jar包:

      <!-- 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>
      
      
    • 配置SpringMVC需要的配置

      web.xml

      <?xml version="1.0" encoding="UTF-8"?>
      <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
               version="4.0">
          <servlet>
              <servlet-name>springmvc</servlet-name>
              <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
              <init-param>
                  <param-name>contextConfigLocation</param-name>
                  <param-value>classpath:springmvc-servlet.xml</param-value>
              </init-param>
              <load-on-startup>1</load-on-startup>
          </servlet>
          <servlet-mapping>
              <servlet-name>springmvc</servlet-name>
              <url-pattern>/</url-pattern>
          </servlet-mapping>
      
      
          <filter>
              <filter-name>encoding</filter-name>
              <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
              <init-param>
                  <param-name>encoding</param-name>
                  <param-value>utf-8</param-value>
              </init-param>
          </filter>
          <filter-mapping>
              <filter-name>encoding</filter-name>
              <url-pattern>/*</url-pattern>
          </filter-mapping>
      
      </web-app>
      

      springmvc-servlet.xml

      <?xml version="1.0" encoding="UTF-8"?>
      <beans xmlns="http://www.springframework.org/schema/beans"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xmlns:context="http://www.springframework.org/schema/context"
             xmlns:mvc="http://www.springframework.org/schema/mvc"
             xsi:schemaLocation="http://www.springframework.org/schema/beans
              https://www.springframework.org/schema/beans/spring-beans.xsd
              http://www.springframework.org/schema/context
              https://www.springframework.org/schema/context/spring-context.xsd
              http://www.springframework.org/schema/mvc
              https://www.springframework.org/schema/mvc/spring-mvc.xsd">
      
          <!--自动扫描包 让指定包下的注解生效 由IOC容器统一管理-->
          <context:component-scan base-package="com.kuang.controller"/>
      
          <!--视图解析器: 模版引擎-->
          <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver">
              <property name="prefix" value="/WEB-INF/jsp/"/>
              <property name="suffix" value=".jsp"/>
          </bean>
      
      
      
      </beans>
      
    • 编写一个User实体类,然后编写测试Controller;

    • 这里我们需要两个新东西,一个是@ResponseBody,一个是ObjectMapper对象;

      @Controller
      public class UserController {
          @RequestMapping("j1")
          @ResponseBody //表示不走视图解析器
          public String json1() throws JsonProcessingException {
              //jackson的对象 ObjectMapper
              ObjectMapper objectMapper = new ObjectMapper();
      
              //创建对象
              User user = new User("胡巴1号", 3, "男");
      
              String s = objectMapper.writeValueAsString(user);
              return s;
          }
      }
      
    • 配置Tomcat,启动测试一下!

    • 发现乱码问题,我们需要设置他的编码格式为ntf-8,以及它的返回类型;

    • 通过@RequestMapping的produces属性来实现

      @RequestMapping(value = "j1",produces = "application/json;charset=utf-8")
      
    • 再次测试,乱码问题解决!

    代码优化

    乱码统一解决

    我们可以在springmvc配置文件上添加一段消息StringHttpMessageConverter转换配置!

    <!--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="false"/>
                    </bean>
                </property>
            </bean>
        </mvc:message-converters>
    </mvc:annotation-driven>
    

    返回json字符串统一解决

    如果要不走视图解析器,两种方法:

    1. 在方法上使用注解@ResponseBody
    2. 在类上使用注解@RestController
    @RequestMapping("/j1")
    @ResponseBody //表示不走视图解析器
    public String json1() throws JsonProcessingException {
        //jackson的对象 ObjectMapper
        ObjectMapper objectMapper = new ObjectMapper();
    
        //创建对象
        User user = new User("胡巴1号", 3, "男");
    
        String s = objectMapper.writeValueAsString(user);
        return s;
    }
    

    测试集合输出

    @RequestMapping("/j2")
    @ResponseBody
    public String json2() throws JsonProcessingException {
    
        ObjectMapper objectMapper = new ObjectMapper();
    
        List<User> userList=new ArrayList<User>();
        User user1 = new User("胡巴1号", 3, "男");
        User user2 = new User("胡巴2号", 4, "男");
        User user3 = new User("胡巴3号", 5, "男");
    
        userList.add(user1);
        userList.add(user2);
        userList.add(user3);
    
        String s = objectMapper.writeValueAsString(userList);
        return s;//合并成一句代码 new ObjectMapper().writeValueAsString(userlist);
    }
    

    输出时间对象

        @RequestMapping("/j3")
        @ResponseBody
        public String json3() throws JsonProcessingException {
            ObjectMapper objectMapper = new ObjectMapper();
    
            //默认时间戳 timestamp
    //        String time = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date);
            //第二种方法,使用ObjectMapper 关闭默认时间戳输出
            objectMapper.configure(SerializationFeature.WRITE_DURATIONS_AS_TIMESTAMPS,false);
            objectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
            Date date = new Date();
            String s = objectMapper.writeValueAsString(date);
            return s;
        }
    }
    

    抽取为工具类

    如果要经常使用的话,这样是比较麻烦的,我们可以封装到一个工具类中。

    public class JsonUtils {
        public static String getJson(Object object){
            return getJson(object,"yyyy-MM-dd HH:mm:ss");
        }
    
        public static String getJson(Object object,String dateFormat){
            ObjectMapper objectMapper = new ObjectMapper();
            objectMapper.configure(SerializationFeature.WRITE_DURATIONS_AS_TIMESTAMPS,false);
            SimpleDateFormat sdf = new SimpleDateFormat(dateFormat);
            objectMapper.setDateFormat(sdf);
    
            try {
                return objectMapper.writeValueAsString(object);
            } catch (JsonProcessingException e) {
                e.printStackTrace();
            }
            return null;
        }
    }
    

    FastJson

    fastjson.jar是阿里开发的一款专门用于Java开发的包,可以方便的实现json对象与JavaBean对象互相的转换。

    pom依赖:

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

    fastjson三个主要的类:

    • JSONObject代表json对象
      • JSONObject实现了Map接口
      • JSONObject对应json对象。通过各种形式的get()方法获取json对象的数据,也可以用诸如size(),isEmpty()等方法获取“键:值”对的个数和判空
    • JSONArray代表json对象数组
      • 内部是由List接口中的方法来完成操作的。
    • JSON代表JSONObject和JSONArray的转化
      • JSON类源码分析与使用
    @RequestMapping("/j4")
    @ResponseBody
    public String json4() throws JsonProcessingException {
        List<User> userList=new ArrayList<User>();
        User user1 = new User("胡巴1号", 3, "男");
        User user2 = new User("胡巴2号", 4, "男");
        User user3 = new User("胡巴3号", 5, "男");
    
        userList.add(user1);
        userList.add(user2);
        userList.add(user3);
    
        String s = JSON.toJSONString(userList);
        return s;
    
    }
    

  • 相关阅读:
    Java堆栈详解
    JVM 图形化监控工具
    Tomcat 7优化前及优化后的性能对比
    Java 枚举常见7种用法
    GitHub上如何删除repository仓库
    eclipse下使用git上传(下载)代码至(从)github
    标准的软件工程过程之文档标准
    maven添加本地非repository中的jar包
    Junit初级篇
    mongodb拷贝数据库copyDatabase()。实现释放磁盘空间的方法。
  • 原文地址:https://www.cnblogs.com/CodeHuba/p/13628110.html
Copyright © 2011-2022 走看看