SpringMVC学习13:什么是JSON

SpringMVC学习13:什么是JSON

  • 什么是JSON:

    • JSON(javaScript Object Notation : js对象标记)是一种轻量级的数据交换格式,目前使用特别广泛;

    • 采用完全独立于编程语言的文本格式来存储和表示数据;

    • 简洁和清晰的层次结构使得JSON成为理想的数据交换语言;

    • 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率

 

  • JavaScript:

    • 在 JavaScript 语言中,一切都是对象。因此,任何JavaScript 支持的类型都可以通过 JSON 来表示,例如字符串、数字、对象、数组等。看看他的要求和语法格式:

    • 对象表示为键值对,数据由逗号分隔;

    • 花括号保存对象;

    • 方括号保存数组;

       

    • JSON 键值对是用来保存 JavaScript 对象的一种方式,和 JavaScript 对象的写法也大同小异,键/值对组合中的键名写在前面并用双引号 "" 包裹,使用冒号 : 分隔,然后紧接着值:

      {"name": "demo"}
      {"age": "3"}
      {"sex": "男"}
    • 很多人搞不清楚 JSON 和 JavaScript 对象的关系,甚至连谁是谁都不清楚。其实,可以这么理解:JSON 是 JavaScript 对象的字符串表示法,它使用文本表示一个 JS 对象的信息,本质是一个字符串

      var obj = {a: 'Hello', b: 'World'}; //这是一个对象,注意键名也是可以使用引号包裹的
      var json = '{"a": "Hello", "b": "World"}'; //这是一个 JSON 字符串,本质是一个字符串

       

     

  • JSON 和 JavaScript 对象互转:

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

      var obj = JSON.parse('{"a": "Hello", "b": "World"}');
      //结果是 {a: 'Hello', b: 'World'}
    • 要实现从JavaScript 对象转换为JSON字符串,使用 JSON.stringify() 方法:

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

       

 

  • 代码测试:

    • 测试页面:

      <!DOCTYPE html>
      <html lang="en">
      <head>
         <meta charset="UTF-8">
         <title>Title</title>

         <script type="text/javascript">

             //编写一个javascript对象 es6 len
             var user={
                 name:"demo",
                 age:3,
                 sex:"男"
            }
             //将JS对象转换为JSON对象:
             var s = JSON.stringify(user);
             console.log(s);

             console.log("================");

             //将JSON对象转换为JS对象:

             var parse = JSON.parse(s);
             console.log(parse);

         </script>
      </head>
      <body>


      </body>
      </html>

       

 

 

  • java生成JSON对象,传给前端:Controller返回JSON数据【重点】

    • Jackson使用;

    • Fastjson使用;

 

 



 

 

  • Jackson使用:

      • Jackson应该是目前比较好的json解析工具了;

      • 当然工具不止这一个,比如还有阿里巴巴的 fastjson 等等。

      • 1,使用它需要导入它的jar包:

        <dependency>
          <groupId>com.fasterxml.jackson.core</groupId>
          <artifactId>jackson-databind</artifactId>
          <version>2.9.8</version>
        </dependency>
      • 2,配置SpringMVC需要的配置:

      • 2.1: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">

          <!--1.注册servlet-->
          <servlet>
              <servlet-name>SpringMVC</servlet-name>
              <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
              <!--通过初始化参数指定SpringMVC配置文件的位置,进行关联-->
              <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>

          <!--所有请求都会被springmvc拦截 -->
          <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>
      • 2.2: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
              http://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">


           <!--   注解方式:扫描包-->
           <context:component-scan base-package="com.xx.controller"/>

           <!--处理器适配器,处理器映射器-->
           <mvc:annotation-driven/>
           <!--过滤静态资源-->
           <mvc:default-servlet-handler/>


           <!--视图解析器-->
           <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver">
               <property name="prefix" value="/WEB-INF/jsp/"/>
               <property name="suffix" value=".jsp"/>
           </bean>

        </beans>
      • 2.3:编写实体类和Controller:

        @Controller
        public class TestController {

           //把User对象转化为JSON字符串
           @RequestMapping(value = "/j1",produces = "application/json;charset=utf-8")
           @ResponseBody  //主要加了这个注解,就不会走视图解析器,会直接返回一个字符串
           public String jsondemo() throws JsonProcessingException {

               User user = new User(1,"张三","11111");
               //jsckson ObjectMapper对象
               ObjectMapper mapper = new ObjectMapper();
               String s = mapper.writeValueAsString(user);

               return s;
          }
        }
      • 2.4,配置Tomcat:启动测试:{"id":1,"name":"??","pwd":"11111"}

         

      • 【乱码问题】:需要设置一下编码格式为:utf-8,以及它的返回的类型;

        • 通过@RequestMapping(value = "/j1",produces = "application/json;charset=utf-8")实现:

      • {"id":1,"name":"张三","pwd":"11111"}
      • 【注意】:使用JSON记得处理乱码问题;

         

     

  • 代码优化:

    • 乱码统一解决:

      • 上一种方法比较麻烦,如果项目中有许多请求则每一个都要添加,可以通过Spring配置统一指定,这样就不用每次都去处理了!

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

        <!--处理器适配器,处理器映射器-->
        <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>
      • 修改Controller代码:

        @RequestMapping(value = "/j1")
        @ResponseBody  //主要加了这个注解,就不会走视图解析器,会直接返回一个字符串
        public String jsondemo() throws JsonProcessingException {

           User user = new User(1,"张三","11111");
           //jsckson ObjectMapper对象
           ObjectMapper mapper = new ObjectMapper();
           String s = mapper.writeValueAsString(user);
           return s;
        }

         

    • 返回json字符串统一解决:

      • 在类上直接使用 @RestController ,这样子,里面所有的方法都只会返回 json 字符串了,不用再每一个都添加@ResponseBody !我们在前后端分离开发中,一般都这样使用 ;

        @RestController
        public class TestController {

           //把User对象转化为JSON字符串
           @RequestMapping(value = "/j1")
           public String jsondemo() throws JsonProcessingException {

               User user1 = new User(1,"张三1","11111");
               User user2 = new User(1,"张三2","11111");
               User user3 = new User(1,"张三3","11111");
               List<User> listUser=new ArrayList<User>();
               listUser.add(user1);
               listUser.add(user2);
               listUser.add(user3);
               ObjectMapper mapper = new ObjectMapper();
               String s = mapper.writeValueAsString(listUser);
               return s;
          }
        }
      • 测试结果:[{"id":1,"name":"张三1","pwd":"11111"},{"id":1,"name":"张三2","pwd":"11111"},{"id":1,"name":"张三3","pwd":"11111"}]

         

    • 输出时间对象:

      • 增加一个方法:

        //json输出时间对象
        @RequestMapping("/j3")
        public String jsondemo3() throws JsonProcessingException {
           Date date = new Date();
           //ObjectMapper,时间解析后的默认格式为:timestamp:时间戳
           return new ObjectMapper().
               writeValueAsString(date);//timestamp:1650176747348
        }
      • 默认日期格式会变成一个数字,是1970年1月1日到当前日期的毫秒数!

      • Jackson 默认是会把时间转成timestamps形式;

         

      • 优化方案:取消Timestamp形式 , 自定义时间格式

        @RequestMapping("/j4")
        public String jsondemo4() throws JsonProcessingException {
           ObjectMapper mapper = new ObjectMapper();
           //不使用时间戳的方式
           ObjectMapper configure = mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
           SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd:HH:mm:ss");
           String format = sdf.format(new Date());
           return mapper.writeValueAsString(format);//"2022-04-17:14:34:21"
        }

         

    • 抽取为工具类:

      • 经常使用的话,我们可以将这些代码封装到一个工具类中;

        @Controller
        public class JsonUtils {

           //默认日期格式
           public static String getFormatDefault(Date date){
               return getFormat(date,"yyyy-MM-dd:HH:mm:ss");
          }


           //封装Json日期对象
           public static String getFormat(Date date,String str) {
               String resFormat=null;
               ObjectMapper mapper = new ObjectMapper();
               //不使用时间戳的方式
               ObjectMapper configure = mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
               SimpleDateFormat sdf = new SimpleDateFormat(str);
               String format = sdf.format(date);
               try {
                   resFormat= mapper.writeValueAsString(format);
              } catch (JsonProcessingException e) {
                   e.printStackTrace();
              }
               return resFormat;
          }


        }

 

 

 



 

  • Fastjson使用:

    • fastjson是阿里开发的一款专门用于Java开发的包;

      • 实现json对象与JavaBean对象的转换;

      • 实现JavaBean对象与json字符串的转换;

      • 实现json对象与json字符串的转换;

         

    • 1,引入jar包的依赖:

      <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>fastjson</artifactId>
        <version>1.2.60</version>
      </dependency>
    • 2,fastjson 三个主要的类:

      • JSONObject 代表 json 对象

      • JSONArray 代表 json 对象数组

      • JSON代表 JSONObject和JSONArray的转化

      @RestController
      public class TestController2 {

         @RequestMapping("/f1")
         public String getTest1(){
             User user1 = new User(1,"张三4","11111");
             User user2 = new User(1,"张三5","11111");
             User user3 = new User(1,"张三6","11111");
             List<User> userList=new ArrayList<User>();
             userList.add(user1);
             userList.add(user2);
             userList.add(user3);

             System.out.println("=====java象转为JSON字符串");
             String s1 = JSON.toJSONString(userList);
             System.out.println("---->:"+s1);
             System.out.println("---->:"+user1);
             String u1 = JSON.toJSONString(user1);


             System.out.println("=====JSON字符串转为Java对象");
             User newUser = JSON.parseObject(u1,User.class);
             System.out.println(newUser);


             System.out.println("=====Java对象 转 JSON对象");
             JSONObject j1 = (JSONObject)JSON.toJSON(user1);
             System.out.println(j1.getString("name"));

             System.out.println("=====JSON对象 转 Java对象 ");
             User newUser2 = j1.toJavaObject(j1, User.class);
             System.out.println(newUser2);

             return "";
        }

      }

       

 

 

 

 

 

posted @ 2022-04-17 14:50  gzs1024  阅读(81)  评论(0编辑  收藏  举报