六、Json 数据的交互处理

文章目录

  • [一、JSON 数据的交互处理](#一、JSON 数据的交互处理)
    • [1、为什么要使用 JSON](#1、为什么要使用 JSON)
    • [2、JSON 和 JavaScript 之间的关系](#2、JSON 和 JavaScript 之间的关系)
    • [3、前端操作 JSON](#3、前端操作 JSON)
      • [3.1 JavaScript 对象与 JSON 字符串之间的相互转换](#3.1 JavaScript 对象与 JSON 字符串之间的相互转换)
    • [4、JAVA 操作 JSON](#4、JAVA 操作 JSON)
      • [4.1 Json 的解析工具(Gson、FastJson、Jackson)](#4.1 Json 的解析工具(Gson、FastJson、Jackson))
      • [4.2 @ResponseBody 注解、@RestController 注解](#4.2 @ResponseBody 注解、@RestController 注解)
      • [4.3 java 中操作 JSON 的方式:返回值不做处理,返回默认 json](#4.3 java 中操作 JSON 的方式:返回值不做处理,返回默认 json)
        • [4.3.1 配置乱码过滤器(乱码问题统一解决)](#4.3.1 配置乱码过滤器(乱码问题统一解决))
      • [4.4 java 中操作 JSON 的方式: Jackson](#4.4 java 中操作 JSON 的方式: Jackson)

JSON 概况以及 JAVA 基本操作 JSON 数据的方式


一、JSON 数据的交互处理

1、为什么要使用 JSON

因为现在的项目大多数都是前后端分离的项目,前端和后端都独立开发和部署。

由后端提供接口,前端从接口获取数据,将数据渲染到页面上。前后端数据传输的格式就是 JSON!

2、JSON 和 JavaScript 之间的关系

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

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

3、前端操作 JSON

  • 代码示例

    • 创建一个 HTML 文件,在 < head > 中添加 < script > 标签编写示例代码

      • 注:< script > 必须成对出现,否则不生效

        html 复制代码
        <!DOCTYPE html>
        <html lang="en">
        <head>
            <meta charset="UTF-8">
            <title>Title</title>
        
            <script type="application/javascript">
        
        		// 创建对象,定义属性并赋值
                var user = {
                    name:"姚青",
                    age:24,
                    sex:"男"
                }
                // 打印 user 对象
                console.log(user);
        
            </script>
        </head>
        <body>
        
        </body>
        </html>
      • 通过浏览器打开该文件,可以看到打印的对象(对象是可以打开的,字符串不行)

3.1 JavaScript 对象与 JSON 字符串之间的相互转换

  • 在 JavaScript 中默认提供了一个 JSON 的类,这个类中提供了两个方法,可以实现 JSON 和 JavaScript 的相互转换

    • parse() :将 JSON 字符串转换为 JavaScript 对象

    • stringify() :将 JavaScript 对象转换为 JSON 字符串

      html 复制代码
      <!DOCTYPE html>
      <html lang="en">
      <head>
          <meta charset="UTF-8">
          <title>Title</title>
      
          <script type="application/javascript">
      
              var user = {
                  name:"姚青",
                  age:24,
                  sex:"男"
              }
              // 打印正常对象
              console.log(user);
      
      		// 打印对象转换后的JSON
              var json = JSON.stringify(user);
              console.log(json);
      
      		// 打印JSON转换的JavaScript 对象
              var JavaScript = JSON.parse(json);
              console.log(JavaScript);
      
          </script>
      </head>
      <body>
      
      </body>
      </html>	
    • 执行结果


4、JAVA 操作 JSON

4.1 Json 的解析工具(Gson、FastJson、Jackson)

  • Gson:谷歌公司推出的Json解析工具

    • Gson 主要有 toJson 与 fromJson 两个转换方法,通过这两个方法实现 Json 与 Java 对象之间的相互转换

    • Gson详解用法


  • FastJson:阿里巴巴推出的Json解析工具

    • FastJson 在复杂类型的 Bean 转换 Json 上会出现一些问题,可能会出现引用的类型,导致 Json 转换出错,需要制定引用。

    • FastJson 采用独创的算法,将解析的速度提升到极致,超过所有 json 库。

      • FastJson 依赖包,导入 pom.xml 中即可使用

        xml 复制代码
        <dependency>
           <groupId>com.alibaba</groupId>
           <artifactId>fastjson</artifactId>
           <version>1.2.60</version>
        </dependency>
    • FastJson的使用方法


  • Jackson:Jackson 是比较著名的一个解析工具

    • Jackson 是当前用的比较广泛的,用来序列化和反序列化 json 的 Java 的开源框架

    • Jackson 社 区相对比较活跃,更新速度也比较快,是最流行的 json 解析器之一

      • Jackson 依赖包,导入 pom.xml 中即可使用

        xml 复制代码
        <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-core -->
        <dependency>
                    <groupId>com.fasterxml.jackson.core</groupId>
                    <artifactId>jackson-databind</artifactId>
                    <version>2.9.8</version>
        </dependency>
        • ObjectMapper 类

          • ObjectMapper 类(com.fasterxml.jackson.databind.ObjectMapper)是 Jackson 的主要类,它可以帮助我们快速的进行各个类型和Json类型的相互转换。

            • public String writeValueAsString(Object value): 将 Java 对象转换成 JSON

        ObjectMapper 类详解


  • 区别

    • FastJson的性能优于Gson,但是处理复杂类型时可能会出现一些错误,到现在还有很多BUG没修。
    • Gson的功能非常的齐全。
    • Jakson性能也非常出色,但是将核心功能拆分成三个模块,有Jar依赖。

注:Java工具千千万,处理 json 的工具有很多,大多数都是可以完成数据转换这一过程的,只是不同的工具所呈现的效果不一。所以,选择适合工具即可。


4.2 @ResponseBody 注解、@RestController 注解

  • @ResponseBody 注解

    • 1、概念

      • @ResponseBody 注解,使用在控制层(controller)的方法上。

    • 2、作用

      • 将方法的返回值,以特定的格式写入到response的body区域,进而将数据返回给客户端。

        当方法上面没有写ResponseBody,底层会将方法的返回值封装为ModelAndView对象。

        如果返回值是字符串,那么直接将字符串写到客户端;如果是一个对象,会将对象转化为 json 串,然后返回给客户端。


  • @RestController 注解

    • 1、概念

      • @ResponseBody 注解,使用在控制层(controller)的类上。

    • 2、作用

      • @RestController 的作用等同于 @Controller + @ResponseBody。并且改注解的作用域是整个类,当类被该注解标记时,类中所有的方法都会返回 JSON ,不用再每一个方法上都添加 @ResponseBody了。

注:当使用 @ResponseBody 注解和 @RestController 注解时,就不会去走视图解析器了,直接返回一个字符串,


4.3 java 中操作 JSON 的方式:返回值不做处理,返回默认 json

  • 代码示例:

    • 配置 SpringMVC 需要的配置

      • web.xml

        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>
      • Spring 配置文件

        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">
        
            <!-- 自动扫描指定的包,下面所有注解类交给IOC容器管理 -->
            <context:component-scan base-package="com.sys.controller"/>
        
        </beans>
    • 创建实体类

      java 复制代码
      @Data
      public class User {
      
          private String id;
          private String name;
          private int age;
          private String sex;
          private String pass;
          
          public User(String id, String name, int age, String sex, String pass) {
              this.id = id;
              this.name = name;
              this.age = age;
              this.sex = sex;
              this.pass = pass;
          }
      
      }
    • 创建 Controller

      java 复制代码
      @Controller
      public class UserController {
      
          @RequestMapping("/json")
          @ResponseBody
          public String getUserJson() {
      		return new User("1", "姚青", 999, "男", "123456").toString();
          }
      }
    • 启动 tomcat,发现返回的 Json 中数字类型返回正常,中文乱码


4.3.1 配置乱码过滤器(乱码问题统一解决)

  • 在 Spring 配置文件中配置乱码过滤器

    xml 复制代码
    	<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>
  • 重新发布项目


4.4 java 中操作 JSON 的方式: Jackson

  • 代码示例1:将Java对象转换成 JSON

    • 创建 controller,引入 Jackson 工具依赖其余内容不变

      java 复制代码
      @RestController
      public class JacksonController {
      
          @RequestMapping("/getJackson")
          public String getJackson(){
      
      		User user = new User("1", "姚青", 999, "男", "123456");
      
              //创建 jackson 对象映射器,用来解析数据
              ObjectMapper objectMapper = new ObjectMapper();
              String str;
              try {
                  // 将 java 对象转换成 json
                   str = objectMapper.writeValueAsString(user);
              } catch (JsonProcessingException e) {
                  throw new RuntimeException(e);
              }
              return str;
          }
          
      }
    • 启动 tomcat,查看结果


  • 代码示例2:返回集合,通过 Jackson 将集合转换成 JSON

    • 在 JacksonController 中新增接口

      java 复制代码
      @RestController
      public class JacksonController {
      
          @RequestMapping("/getJackson")
          public String getJackson() {
      
              User user = new User("1", "姚青", 999, "男", "123456");
      
              //创建 jackson 对象映射器,用来解析数据
              ObjectMapper objectMapper = new ObjectMapper();
              String str;
              try {
                  // 将 java 对象转换成 json
                  str = objectMapper.writeValueAsString(user);
              } catch (JsonProcessingException e) {
                  throw new RuntimeException(e);
              }
              return str;
          }
      
      
          @RequestMapping("/getJackson2")
          public String getJackson2() {
      
              User user = new User("1", "姚青", 999, "男", "123456");
              User user2 = new User("2", "姚青2", 998, "男", "123456");
              User user3 = new User("3", "姚青3", 997, "男", "123456");
              User user4 = new User("4", "姚青4", 996, "男", "123456");
      
              List<User> list = new ArrayList<>();
              Collections.addAll(list, user, user2, user3, user4);
      
              //创建 jackson 对象映射器,用来解析数据
              ObjectMapper objectMapper = new ObjectMapper();
              String str;
              try {
                  // 将 java 对象转换成 json
                  str = objectMapper.writeValueAsString(list);
              } catch (JsonProcessingException e) {
                  throw new RuntimeException(e);
              }
              return str;
          }
      
      }
    • 运行结果


相关推荐
胡琦博客2 小时前
HarmonyOS 智能工具箱(三):语音交互工具
交互·xcode·harmonyos
静水楼台x3 小时前
spring security
java·数据库·spring
咖啡八杯11 小时前
GoF设计模式——解释器模式
java·后端·spring·设计模式
糖果店的幽灵12 小时前
【DeepAgents 从入门到精通】Context Management 上下文管理
java·人工智能·后端·spring·中间件·langgraph·deepagents
Suhan4218 小时前
IDEA 设置启动参数和环境变量
spring boot·spring·编辑器·idea
人生百态,人生如梦18 小时前
情感交互仿生人从技术到落地构想3——技术交流贴(2026.7)
人工智能·机器学习·人机交互·交互·具身智能
Geoking.20 小时前
JSON vs JSONL:从数据格式到 AI Agent 的工程实践
人工智能·深度学习·json
橘子海全栈攻城狮21 小时前
【最新源码】基于SpringBoot + Vue的超市管理系统的设计与实现D002
java·开发语言·vue.js·spring boot·后端·spring
空中湖1 天前
Spring AI Function Calling 完全指南:让 AI 查数据库、调 API、发通知
数据库·人工智能·spring
风起洛阳@不良使1 天前
spring中xml和注解开发的对比
xml·java·spring