JSON-框架的具体使用

news2024/11/16 19:29:09

JSON-框架的具体使用

非 SpringBoot 项目

Jackson

Jackson 是另一个流行的JSON序列化和反序列化库,具有以下特点

  • 速度快:Jackson 采用了高效的JSON解析算法和字节码生成技术,使得其序列化和反序列化速度非常快。
  • 支持全类型序列化:Jackson 能够序列化所有类型的对象,包括复杂类型和自定义类型。
  • 功能强大:Jackson 提供了很多高级特性,如 JSON 映射、注解和 JSON 树模型等,使得其在企业级应用中得到广泛应用。
  • 依赖

    <!-- 测试 JSON 框架时项目所有依赖 -->
    <dependencies>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.26</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13.2</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-core</artifactId>
            <version>2.13.0</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.13.0</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-annotations</artifactId>
            <version>2.13.0</version>
        </dependency>
    </dependencies>
    
  • 使用示例

    package org.example.demo;
    
    import com.fasterxml.jackson.core.JsonProcessingException;
    import com.fasterxml.jackson.databind.ObjectMapper;
    import lombok.AllArgsConstructor;
    import lombok.Data;
    import lombok.NoArgsConstructor;
    
    public class JacksonExample {
    
        public static void main(String[] args) throws JsonProcessingException {
            // 将 Java 对象转换为 JSON 字符串
            User user = new User("Tom", 18);
            ObjectMapper mapper = new ObjectMapper();
            String json = mapper.writeValueAsString(user);
            System.out.println(json); // {"name":"Tom","age":18}
    
            // 将 JSON 字符串转换为 Java 对象
            String jsonStr = "{\"name\":\"Tom\",\"age\":18}";
            User user2 = mapper.readValue(jsonStr, User.class);
            System.out.println(user2.getName() + " " + user2.getAge()); // Tom 18
        }
    
        @Data
        @NoArgsConstructor
        @AllArgsConstructor
        static class User {
            private String name;
            private int age;
        }
    }
    

Gson

GsonGoogle 提供的 JSON 序列化和反序列化库。Gson 也是一个非常流行的 JSON序列化和反序列化库,具有以下特点

  • 简单易用:Gson 的使用非常简单,只需要在项目中引入 gson.jar,即可开始使用。

  • 高度灵活性:Gson 可以很方便地处理各种类型的对象,包括 Java 8 的新特性,如LocalDateLocalDateTime

  • 扩展性强:Gson 提供了很多扩展点,可以方便地进行自定义扩展。

  • 依赖

    <!-- 测试 JSON 框架时项目所有依赖 -->
    <dependencies>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.26</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13.2</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>com.google.code.gson</groupId>
            <artifactId>gson</artifactId>
            <version>2.8.9</version>
        </dependency>
    </dependencies>
    
    
  • 使用示例

    package org.example.demo;
    
    import com.google.gson.Gson;
    import lombok.AllArgsConstructor;
    import lombok.Data;
    import lombok.NoArgsConstructor;
    
    public class GsonExample {
    
        public static void main(String[] args) {
            // 将 Java 对象转换为 JSON 字符串
            User user = new User("Tom", 18);
            Gson gson = new Gson();
            String json = gson.toJson(user);
            System.out.println(json); // {"name":"Tom","age":18}
            // 将 JSON 字符串转换为 Java 对象
            String jsonStr = "{\"name\":\"Tom\",\"age\":18}";
            User user2 = gson.fromJson(jsonStr, User.class);
            System.out.println(user2.getName() + " " + user2.getAge()); // Tom 18
        }
    
        @Data
        @NoArgsConstructor
        @AllArgsConstructor
        static class User {
            private String name;
            private int age;
    
        }
    }
    
    

Fastjson

Fastjson 是阿里巴巴开源的 JSON 序列化和反序列化库,由于其高效性和稳定性,成为目前使用最广泛的 JSON 序列化和反序列化库之一。以下是 Fastjson 的主要特点

  • 高性能:Fastjson 采用了许多优化措施,如字节码生成和对象池,使得其反序列化速度非常快,序列化速度也很快。

  • 支持全类型序列化:Fastjson 能够序列化所有类型的对象,包括复杂类型和自定义类型。

  • 兼容性好:Fastjson支持 JSON 标准规范,并且与其他 JSON 库兼容。

  • 使用方便:Fastjson 的使用非常简单,几乎不需要配置,只需要在项目中引入 fastjson.jar,即可开始使用。

  • 依赖

    <dependencies>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.26</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13.2</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.78</version>
        </dependency>
    </dependencies>
    
  • 用法

    package org.example.demo;
    
    import com.alibaba.fastjson.JSON;
    import lombok.AllArgsConstructor;
    import lombok.Data;
    import lombok.NoArgsConstructor;
    
    public class FastjsonExample {
    
        public static void main(String[] args) {
            // 将 Java 对象转换为 JSON 字符串
            User user = new User("Tom", 18);
            String json = JSON.toJSONString(user);
            System.out.println(json); // {"age":18,"name":"Tom"}
    
            // 将 JSON 字符串转换为 Java 对象
            String jsonStr = "{\"age\":18,\"name\":\"Tom\"}";
            User user2 = JSON.parseObject(jsonStr, User.class);
            System.out.println(user2.getName() + " " + user2.getAge()); // Tom 18
        }
    
        @Data
        @NoArgsConstructor
        @AllArgsConstructor
        static class User {
            private String name;
            private int age;
        }
    }
    

SpringBoot项目中使用

Jackson

  • 介绍

    Spring Boot 中,JSON序列化和反序列化默认使用 Jackson 库,因此不需要额外配置 Jackson 的依赖。但如果想使用 FastjsonGson 库,可以通过以下方式配置 Maven 依赖

  • 依赖导入未发生变化

  • Jackson: 不需要添加,因为当添加spring-boot-starter-web的依赖时内部已经添加了

    jackson

Gson

  • 因为使用spring-boot-starter-web内部已经有jackson,为了使用gson,所以排除jackson的依赖

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-json</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>com.google.code.gson</groupId>
            <artifactId>gson</artifactId>
            <version>2.8.9</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
    
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
        </dependency>
    </dependencies>
    
  • yml

    # 可以配置的一些参数
    spring:
      gson:
        # 用于指定日期格式化的格式字符串,将 Java 对象中的日期类型属性转换成对应的字符串形式。示例配置 yyyy-MM-dd HH:mm:ss 表示使用标准的日期格式将日期类型属性转换成字符串形式。如果不配置该属性,则使用 Gson 默认的日期格式化方式。
        date-format: yyyy-MM-dd HH:mm:ss
        # disable-html-escaping:用于指定是否禁用 HTML 转义,当序列化 HTML 内容时,开启该选项可以防止 XSS 攻击。该属性默认值为 false,即默认启用 HTML 转义。
        disable-html-escaping: true
        # disable-inner-class-serialization:用于指定是否禁用序列化内部类,默认值为 false,即序列化内部类。
        disable-inner-class-serialization: true
        # enable-complex-map-key-serialization:用于指定是否启用复杂类型的 Map 键的序列化,默认值为 false,即禁用复杂类型的 Map 键的序列化。
        enable-complex-map-key-serialization: true
        # exclude-fields-without-expose-annotation:用于指定是否排除未标注 @Expose 注解的字段,默认值为 false,即不排除未标注 @Expose 注解的字段。
        exclude-fields-without-expose-annotation: true
        # field-naming-policy:用于指定字段命名策略,默认值为 IDENTITY,即使用 Java 对象中的字段名称作为 Gson 中的字段名称。其他可选值包括 LOWER_CASE_WITH_UNDERSCORES、UPPER_CAMEL_CASE 和 UPPER_CAMEL_CASE_WITH_SPACES 等。
        field-naming-policy: LOWER_CASE_WITH_UNDERSCORES
        # serialize-nulls:用于指定是否序列化 null 值,默认值为 false,即不序列化 null 值。
        serialize-nulls: true
    
    
  • 也可以通过GsonBuilder实现,两种方式选择一种

    @Configuration
    public class GsonConfig {
        @Bean
        public GsonBuilder gsonBuilder() {
            GsonBuilder builder = new GsonBuilder();
            builder.setDateFormat("yyyy-MM-dd HH:mm:ss");
            return builder;
        }
    }
    
    配置前配置后(builder.setDateFormat("yyyy-MM-dd HH:mm:ss");)

Fastjson

  • 使用程度较低

  • 排除依赖

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-json</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.78</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
    
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
        </dependency>
    </dependencies>
    
  • 注意点

    需要注意的是,使用 Fastjson 或 Gson 时,要保证它们的依赖包的版本与 Spring Boot 的依赖包版本兼容,避免出现不必要的冲突和错误。

    SpringMVC框架 中,jacksongson已经自动配置好了,只需要添加相应的依赖,而Fastjson则需要开发者手动配置HttpMessageConverter,直接启动会出现如下错误

    Resolved [org.springframework.web.HttpMediaTypeNotAcceptableException: Could not find acceptable representation]
    • 解决方法

      package com.example.jsondemo.config;
      
      import com.alibaba.fastjson.serializer.SerializerFeature;
      import com.alibaba.fastjson.support.config.FastJsonConfig;
      import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter;
      import org.springframework.context.annotation.Configuration;
      import org.springframework.http.converter.HttpMessageConverter;
      import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
      
      import java.util.List;
      
      @Configuration
      public class WebMvcConfig implements WebMvcConfigurer {
      
          /**
           * 使用 Fastjson 作为 HTTP 消息转换器
           */
          @Override
          public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
              FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter();
              converter.setFastJsonConfig(getFastJsonConfig());
              converters.add(converter);
          }
      
          /**
           * 配置 Fastjson
           */
          private FastJsonConfig getFastJsonConfig() {
              FastJsonConfig config = new FastJsonConfig();
              config.setSerializerFeatures(SerializerFeature.WriteMapNullValue, SerializerFeature.WriteNullListAsEmpty, SerializerFeature.WriteNullStringAsEmpty, SerializerFeature.WriteDateUseDateFormat);
              // 也可以直接在 yml 文件中配置
              config.setDateFormat("yyyy-MM-dd HH:mm:ss");
              return config;
          }
      }
      
      
      配置前配置后
    • yml

      spring:
        fastjson:
          date-format: yyyy-MM-dd HH:mm:ss
      
  • 测试

    @SpringBootTest
    class JsonDemoApplicationTests {
    
        @Test
        void contextLoads() {
            User user = new User();
            user.setUid("1001");
            user.setUname("coder-itl");
            user.setAddress("http://coderitl.github.io");
            user.setCreateTime(new Date(System.currentTimeMillis()));
            String toJSONString = JSON.toJSONString(user);
            System.out.println(toJSONString);
            // 反序列化
        }
    }
    
    
    • 输出

      测试序列化

序列化和反序列化

  • 序列化: 对象转换为JSON

  • 反序列化: JSON转换为对象

  • 如何实现序列化和反序列化这个过程的?

    • 由转换器:HttpMessageConverter 实现

      Spring 框架中,HttpMessageConverter 是一个用于在消息传递时将消息从一种格式转换为另一种格式的接口。它的主要作用是帮助在不同的客户端和服务之间传递消息,并确保消息在传递过程中能够正确地序列化和反序列化。

      Spring 框架中提供了多个预定义的 HttpMessageConverter 实现,可以根据不同的需求选择使用。常用的消息格式包括 JSON、XML、二进制等。

      配置 HttpMessageConverter 可以通过在 Spring 应用程序上下文中注册 HttpMessageConverter 类型的 Bean来实现。具体语法如下

      @Configuration
      @EnableWebMvc
      public class WebConfig implements WebMvcConfigurer {
      
          @Override
          public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
              converters.add(new MappingJackson2HttpMessageConverter());
          }
      }
      

      上面的示例配置了一个 MappingJackson2HttpMessageConverter 对象,用于将 Java 对象转换为 JSON 格式的消息。在这个例子中,我们使用了 Spring 的 Java 配置方式,并实现了 WebMvcConfigurer 接口中的 configureMessageConverters() 方法来注册我们自己的 MessageConverter 实现。

      需要注意的是,当我们自定义 MessageConverter 时,必须添加到 converters 列表的前面,以确保它是在默认的转换器之前被调用的。此外,我们也可以通过重写 extendMessageConverters() 方法来添加自定义的 MessageConverter,这个方法会在默认的转换器之后调用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/509722.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

V8 过去版本的性能提升汇总

&#xff08;预测未来最好的方法就是把它创造出来——尼葛洛庞帝&#xff09; V8 官方链接 NodeJs8.3之前的代码优化建议 NodeJs8.3版本之后的turbofan虚拟机引擎 编写性能更高的JavaScript代码 chromium 优化博客 chrom v8版本发布路线图 V8 是 Google 的开源高性能 JavaScri…

unity 实现水的波纹效果

之前的实现过这个效果&#xff0c;可惜没有记笔记&#xff0c;所以现在有点遗忘&#xff0c;连多个波纹一起在水面上实现的效果都忘记了&#xff0c;所以&#xff0c;查看了下之前实现的代码&#xff0c;现在再记一下笔记。 基础的波纹效果 要实现波纹&#xff0c;首先要知道…

技术转管理,先来试试管理好项目

今天分享的主题是&#xff1a;如果你想技术转管理&#xff0c;先来试试管好一个项目 技术转管理&#xff0c;是很多技术人员的梦想&#xff0c;这也是30多岁之前还在做技术的人&#xff0c;也会对自己常常发出居安思危的意识表现&#xff0c;所以经常有人问我&#xff0c;怎么样…

chatGPT润色中英论文软件-文章修改润色器

chatGPT可以润色英文论文吗&#xff1f; ChatGPT可以润色英文论文&#xff0c;它具备自动纠错、自动完善语法和严格全面的语法、句法和内容结构检查等功能&#xff0c;可以对英文论文进行高质量的润色和优化。此外&#xff0c;ChatGPT还支持学术翻译润色、查重及语言改写等服务…

Java每日一练(20230510) 生成器类、螺旋矩阵II、删除链表的重复元素II

目录 1. 定义一个类Generator &#x1f31f;&#x1f31f; 2. 螺旋矩阵 II &#x1f31f;&#x1f31f; 3. 删除排序链表中的重复元素 II &#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Golang每日一练 专栏 Python每日一练 专栏 C/C每日…

Linux 设备树

1 什么是设备树&#xff1f; 设备树(Device Tree)&#xff0c;将这个词分开就是“设备”和“树”&#xff0c;描述设备树的文件叫做 DTS(Device Tree Source)&#xff0c;这个 DTS 文件采用树形结构描述板级设备&#xff0c;也就是开发板上的设备信息&#xff0c;比如 CPU 数量…

【Proteus仿真】| 05——问题记录

系列文章目录 【Proteus仿真】| 01——软件安装 【Proteus仿真】| 02——基础使用 【Proteus仿真】| 03——超详细使用教程 【Proteus仿真】| 04——绘制原理图模板 【Proteus仿真】| 05——问题记录 文章目录 前言1、51单片机仿真2、stm32仿真1. stm32 adc 采集电压一直为0 3、…

显卡3080设备CentOS 7.9 环境安装最新anconda、tensorflow-gpu 、cudatoolkit、cudnn、 python

目标&#xff1a;使用3080显卡搭建环境 系统安装 显卡驱动安装&#xff1a; 安装anconda 安装 python 安装 :cuda 安装&#xff1a;cudnn 安装 :tensorflow 一&#xff1a;系统安装&#xff1a;详见历史文档 二&#xff1a;显卡驱动安装&#xff1a;详见历史 三&#xff1a;整…

安装2023最新版_华为欧拉操作系统_OpenEuler操作系统_并配置IP地址_联网---linux工作笔记055

强调,一定要记得,硬盘多给点,50G根本不够用,搭建集群的话,自己测试都要100G才行哈.. 要不然麻烦,因为别的可以动态修改,但是硬盘大小修改了,不起作用,需要在 linux中再设置分区很麻烦 https://www.openeuler.org/zh/download/ 首先去下载安装包 然后找到这个安装包下载 然…

虚拟机中linux操作系统如何连网

文章目录 方法镜像来源本文前提创建centos7虚拟机1. 创建新的虚拟机&#xff0c;选择典型配置2. 安装来源选择上述下载的centos3. 命名虚拟机时注意事项如下图所示4. 后面配置硬盘大小默认20GB足以&#xff0c;然后调整虚拟机设置&#xff0c;可参考下图5.运行虚拟机 实操建议 …

混频器IP3的测量以及测试误差的来源分析

混频器线性度一直是射频系统设计面临的一个关键问题。混频器的非线性会产生不需要的、不可滤的杂散、互调和非线性失真。例如&#xff0c;非线性混频可能导致不希望的杂散&#xff0c;例如2fRF✕2fLO 或2fRF✕fLO 频率分量&#xff0c;加剧射频系统频谱再生问题。 1、IP3和IMD…

工具接口调用报错:“error“: “Unsupported Media Type“

工具接口调用报错&#xff1a;"error": "Unsupported Media Type" 问题原因&#xff1a; Media Type&#xff0c;即是Internet Media Type&#xff0c;互联网媒体类型&#xff0c;也叫做MIME类型&#xff0c;在Http协议消息头中&#xff0c;使用Content-T…

安全成就未来|Fortinet Accelerate 2023·中国区巡展首站启幕

Fortinet Accelerate 2023中国区巡展 年度网络安全盛会 Fortinet Accelerate 2023中国区巡展&#xff0c;昨日在深圳拉开帷幕&#xff0c;开启15城巡展的“首城之站”。本年度巡展主题“安全成就未来”&#xff0c;Fortinet与中企通信、亚马逊云科技等生态合作伙伴&#xff0c…

【动态代理】JDK动态代理与cglib动态代理源码解析

JDK动态代理 demo展示 UserService&#xff0c;接口类 public interface UserService {void addUser(); }UserServiceImpl&#xff0c;实现类 public class UserServiceImpl implements UserService {Overridepublic void addUser() {System.out.println("register al…

【运动规划算法项目实战】如何实现Dubins曲线和Reeds-Shepp曲线(附ROS C++代码)

文章目录 前言一、Dubins曲线二、Reeds-Shepp曲线三、应用场景四、代码实现4.1 Dubins曲线实现4.2 Reeds-Shepp曲线实现4.3 RVIZ显示五、总结前言 Dubins曲线和Reeds-Shepp曲线在机器人、自动驾驶行业中是非常重要的路径规划算法,它们能够有效地在不同的场景中生成最短路径,…

zlmediakit 新增可以使用硬件加速的转码http api接口方法

根据项目需求&#xff0c;我们需要使用硬件解码的方式进行网络摄像头数据帧的解析&#xff0c;给到算法模块使用 1、通过ffmpeg命令实验&#xff0c;ffmpeg -i IPC_URL -f rtsp rtsp://*/live 该命令默认是使用cpu进行解码的&#xff0c;我们需要使用GPU进行解码。 2、ffmpe…

皮特测评:蓝牙耳机哪个品牌最好?300元内最好的蓝牙耳机

大家好&#xff0c;我是皮特&#xff0c;今天要发布的测评主题是&#xff1a;“蓝牙耳机哪个品牌最好&#xff1f;”粉丝们私信给我希望能分享一期平价好用的蓝牙耳机&#xff0c;我购入十多款蓝牙耳机进行了多角度的测评后&#xff0c;总结了五款表现最优秀的蓝牙耳机&#xf…

神仙级python入门教程(非常详细),从零基础入门到精通,从看这篇开始

一.初聊Python 1.为什么要学习Python&#xff1f; 在学习Python之前&#xff0c;你不要担心自己没基础或“脑子笨”&#xff0c;我始终认为&#xff0c;只要你想学并为之努力&#xff0c;就能学好&#xff0c;就能用Python去做很多事情。在这个喧嚣的时代&#xff0c;很多技术…

前端开发之Echarts 图表渐变两种实现方式和动态改变图表类型

前端开发之Echarts 图表渐变两种实现方式 前言效果图一、echarts中存在两种渐变方式1、color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [{}&#xff0c;{}&#xff0c;{}])简单案例 2、{type: linear,x: 0,y: 0,x2: 0,y2: 1, [{}&#xff0c;{}&#xff0c;{}]}案例 二…

硬件通信之 从单片机到C/C++指针详解

一 单片机理论概述 1.1 单片微型计算机&#xff08;Single Chip Microcomputer&#xff09;简称单片机&#xff0c;是把组成微型计算机的主要功能部件&#xff08;CPU、RAM、ROM、I/O口、定时/计数器、串行口等&#xff09;集成在一块芯片中&#xff0c;构成一个完整的微型计…