JSON-框架的具体使用

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,这个方法会在默认的转换器之后调用。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

4年外包终于上岸,我只能说别去....

我大学学的是计算机专业&#xff0c;毕业的时候&#xff0c;对于找工作比较迷茫&#xff0c;也不知道当时怎么想的&#xff0c;一头就扎进了一家外包公司&#xff0c;一干就是4年。现在终于跳槽到了互联网公司了&#xff0c;我想说的是&#xff0c;但凡有点机会&#xff0c;千万…

C语言-【移位操作符详解】

这篇文章主要介绍了C语言中移位操作符&#xff0c;文章中通过详细的代码以及有关计算机中零碎的知识点对移位操作符进行了一个更好的解释&#xff0c;需要的小伙伴们可以一起学习学习吖&#xff5e; 移位操作符:移动的是补码的二进制序列。 在C语言当中&#xff0c;有两种移位…

「OceanBase 4.1 体验」|OCP Express

文章目录 一、简介二、特性介绍2.1 数据库管理2.2 数据库可观测性 一、简介 OCP Express 是一个基于 Web 的 OceanBase 4.x 轻量化管理工具&#xff0c;作为 OceanBase 数据库的工具组件&#xff0c;它集成在 OceanBase 数据库集群中&#xff0c;支持数据库集群关键性能指标查看…

一个月内面了30家公司,薪资从18K变成28K,真行啊····

工作3年&#xff0c;换了好几份工作&#xff08;行业流行性大&#xff09;&#xff0c;每次工作都是裸辞。朋友都觉得不可思议。因为我一直对自己很有信心&#xff0c;而且特别不喜欢请假面试&#xff0c;对自己负责也对公司负责。 但是这次没想到市场环境非常不好&#xff0c;…

一文搞懂Go错误链

0. Go错误处理简要回顾 Go是一种非常强调错误处理的编程语言。在Go中&#xff0c;错误被表示为实现了error接口的类型的值&#xff0c;error接口只有一个方法&#xff1a; type error interface {Error() string } 这个接口的引入使得Go程序可以以一致和符合惯用法的方式进行错…

【SpringCloud01】

SpringCloud01 1.认识微服务1.0.学习目标1.1.单体架构1.2.分布式架构1.3.微服务1.4.SpringCloud1.5.总结 2.服务拆分和远程调用2.1.服务拆分原则2.2.服务拆分示例2.2.1.导入Sql语句2.2.2.导入demo工程 2.3.实现远程调用案例2.3.1.案例需求&#xff1a;2.3.2.注册RestTemplate2.…

Java学习笔记 --- Stream流

一、体验Stream流【理解】 案例需求 按照下面的要求完成集合的创建和遍历 创建一个集合&#xff0c;存储多个字符串元素 把集合中所有以"张"开头的元素存储到一个新的集合 把"张"开头的集合中的长度为3的元素存储到一个新的集合 遍历上一步得到的集合 …

使用edge浏览器,白嫖ChatGPT的保姆级教程来了

前言 嗨&#xff0c;大家好&#xff0c;我是希留&#xff0c;一个被迫致力于全栈开发的老菜鸟。 人工智能大浪潮已经来临&#xff0c;对于ChatGPT&#xff0c;我觉得任何一个玩互联网的人&#xff0c;都应该重视起来&#xff0c;用起来。但是国内使用需要解决科学上网、注册、…

计算机基础--->数据结构(1)【图的存储和遍历】

文章目录 图图的存储图的搜索&#xff08;无向无权图&#xff09;代码演示 图 图中包含 顶点、边、度&#xff0c;无向图&#xff0c;有向图&#xff0c;无权图&#xff0c;带权图&#xff0c;其中 度表示一个顶点包含多少条边&#xff0c;有出度和入度。 图的存储 邻接矩阵 代…

(CVE-2022-22965)Spring Framework 远程命令执行漏洞(vulfocus复现)

漏洞原理 该漏洞是SpringFramework数据绑定的一个漏洞&#xff0c;如果后台方法中接受的参数为非基础类型&#xff0c;Spring会根据前端传入的请求正文中的参数的key值来查询与其名称所对应的getter和setter方法&#xff0c;攻击者利用这一特性修改了Tomcat的一个用于日志记录…

浅谈Android PMS解析APP信息流程

前言 前面我们了解了Zygote的启动流程&#xff0c;知道AMS、PMS都是由SystemServer进程启动的&#xff0c;我们都知道PMS主要负责App管理工作&#xff0c;这里我们简单从源码角度分析下PMS是如何解析APP解析的&#xff1b; 源码分析(API 30为例) 我们还是从PackageManagerSe…

英文论文润色哪家好用比较好,有值得推荐的吗

英文论文润色 推荐 英文论文润色对于写作者来说是一项十分重要的任务&#xff0c;它可以帮助我们修改文章中的语法、标点和排版等问题&#xff0c;使论文更加准确和易读。在众多的英文润色软件中&#xff0c;147chatgpt改写润色软件是一款值得推荐的全自动批量图文润色、自动纠…

财报解读:Q2业绩指引未达预期,狂奔的爱彼迎要减速了?

全球民宿龙头爱彼迎Airbnb迎来了一个强劲的开端。 美东时间5月9日盘后&#xff0c;爱彼迎发布了2023年第一季度财报。财报显示&#xff0c;爱彼迎一季度营收、净利润、总预订金额都获得了不同程度增长&#xff0c;超出市场预期。美中不足的是&#xff0c;公司预计二季度营收下…

对接银行处理退票的解决方案

什么是退票&#xff1f; 在跨行支付时&#xff0c;付款请求提交汇出行后&#xff0c;由汇出行转交至人民银行支付系统&#xff0c;经人民银行大小额系统处理后会先返回交易成功的结果&#xff0c;再由人民银行转至收款行&#xff0c;收款行在清算过程中会将收款人账户信息、状…

战略投资奥琦玮,微盟冲在餐饮复苏最前线

作者 | 辰纹 来源 | 洞见新研社 好起来了&#xff0c;一切都好起来了。 刚刚过去的五一假期&#xff0c;广州费大厨正佳广场店每天取号1000多桌&#xff0c;餐厅翻台率达到了1200%&#xff1b;长沙文和友单日最高排号超过1万&#xff0c;到店人数近6万&#xff1b;武汉主力龙…

【无标题】c++异常机制的一些总结以及思考

在谈及c处理异常机制的方法之前我们不妨来回顾一下c语言是如何应对这块的。 终止程序&#xff0c;如assert&#xff0c;缺陷&#xff1a;用户难以接受。如发生内存错误&#xff0c;除0错误时就会终止程序。 返回错误码&#xff0c;缺陷&#xff1a;需要程序员自己去查找对应的…

输入url后,到页面展示出来

目录 1、用户在浏览器中输入url地址 2、缓存解析 3、浏览器进行DNS解析域名得到服务器ip地址 4、TCP三次握手建立客户端和服务器的连接 5、客户端发送HTTP请求获取服务器端的静态资源 6、服务器发送HTTP响应报文给客户端&#xff0c;客户端获取到页面静态资源 7、TCP四次…

快速了解 TypeScript

目录 1、简介 2、安装TypeScript 3、编译代码 4、类型注解 5、接口 6、类 7、运行TypeScript Web应用 1、简介 TypeScript是JavaScript类型的超集&#xff0c;它可以编译成纯JavaScript。 TypeScript可以在任何浏览器、任何计算机和任何操作系统上运行&#xff0c;并且…

LeetCode_Day2 | 有意思的数组滑动窗口及螺旋矩阵

LeetCode_数组 977.有序数组的平方1.题目描述2.暴力法3. 双指针法 209.长度最小的子数组1.题目描述2.暴力法3.滑动窗口(双指针法) 59.螺旋矩阵1.题目描述2. 螺旋矩阵解法 977.有序数组的平方 1.题目描述 给你一个按 非递减顺序 排序的整数数组 nums&#xff0c;返回 每个数字…

推荐6个我经常逛的“小网站”,嘿嘿嘿!!!

如今&#xff0c;全球互联网上已经有超过 17 亿个网站。除了全球那些主流网站被大家所熟知外&#xff0c;其实还有很多很多网站&#xff0c;被淹没在了互联网世界中。 每次发现优质的内容都会第一时间给大家分享出来&#xff0c;不管是软件&#xff0c;插件&#xff0c;脚本还…