高性能 JSON 处理:为何选择 Fastjson?

一、关于Fastjson

1.1 简介

Fastjson 是由阿里巴巴集团开发的一个高性能的 JSON 处理库,它支持 Java 对象与 JSON 字符串之间的互相转换。Fastjson 自 2011 年发布以来,以其卓越的性能和丰富的功能在 Java 社区中获得了广泛的应用。

23098ed4-04cb-4acd-b976-3e18243195e5

Alibaba Fastjson: 目前在人类已知范围内,这个星球跑的最快的Java JSON库。在过去的十年里,fastjson v1作为国内github star最多和最受欢迎的json解析库,如今fastjson v2 重磅来袭,性能炸裂。

1.2 发展

初始阶段

  • 2010年:FastJSON 的起源可以追溯到 2010 年左右。当时,阿里巴巴的技术专家温绍锦(花名:高铁)在寻找一个高效、易用的 JSON 解析库时发现现有的解决方案并不完全满足需求,于是决定自己动手编写一个。
  • 早期版本:最初的 FastJSON 版本是基于一些基本的需求设计的,目标是提供快速且易于使用的 JSON 处理功能。

成长与发展

  • 开源与社区支持:随着 FastJSON 的性能和功能逐渐得到认可,阿里巴巴决定将其开源,以便更多开发者能够使用并贡献代码。这标志着 FastJSON 开始走向更广泛的社区支持和发展。
  • 版本迭代:FastJSON 经历了多个版本的迭代,每个新版本都会修复已知问题,并引入新的特性和优化。例如,v1.2.x 系列版本中就增加了许多重要的改进和安全特性。

安全性与漏洞

  • 安全性问题:尽管 FastJSON 在性能上表现出色,但它也经历了几次严重的安全漏洞事件。特别是在 v1.2.43 及之前的版本中,存在一些潜在的安全风险,如反序列化攻击等。
  • 响应与改进:面对这些挑战,FastJSON 团队积极应对,发布了多个补丁和更新来解决已知的安全问题,并增强了整体的安全性。

新一代 FastJSON

  • FastJSON 2.0:为了从根本上解决历史遗留的问题,并进一步提升性能和安全性,阿里巴巴推出了 FastJSON 2.0。这个新版本重新设计了架构,提供了更好的兼容性和扩展性,并且更加注重安全性。
  • 持续改进:FastJSON 2.0 之后,团队继续致力于提高库的稳定性和性能,同时增加了一些新的功能和优化,以适应不断变化的技术环境。

当前状态

  • 广泛采用:FastJSON 已经成为国内外非常流行的 JSON 处理库之一,被大量企业级应用和服务所采用。
  • 持续发展:FastJSON 仍在不断发展和完善中,定期发布新的版本以修复 bug、添加新功能和支持最新的 Java 版本。

FASTJSON v2是FASTJSON项目的重要升级,目标是为下一个十年提供一个高性能的JSON库。通过同一套API支持JSON/JSONB两种协议,JSONPath是一等公民,支持全量解析和部分解析,支持Java服务端、客户端Android、大数据场景。

1.3 特点

  1. 高性能: FASTJSON 在序列化和反序列化方面表现出色,速度通常比其他 JSON 处理库(如 Jackson 和 Gson)更快。
  2. 易用性: 提供简单易用的 API,使得 JSON 的处理变得直观,开发者可以轻松地将 Java 对象转化为 JSON 字符串,或从 JSON 字符串中解析出 Java 对象。
  3. 支持复杂数据结构: 能够处理复杂的数据结构,包括嵌套对象、数组等。
  4. 灵活的配置: 提供多种特性配置,允许用户根据需求定制序列化和反序列化的行为,比如日期格式、字段过滤等。
  5. 快速解析: 支持从字符串流或输入流快速解析 JSON 数据,提高了性能和内存使用效率。

1.4 应用场景

  • Web开发:常用于RESTful API的JSON数据处理。
  • 数据交换:在分布式系统中,作为不同服务之间的数据交换格式。
  • 配置文件解析:可以用作应用程序的配置文件格式,方便读取和写入。

二、基本用法

2.1 添加依赖

FastJSON 使用十分方便,只需要在 Maven 工程的 pom 文件中引入以下依赖即可:

v1版本

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.83</version> <!-- 请根据最新版本更新 -->
</dependency>

v2版本

fastjson v2​中,groupId​和1.x​不一样,是com.alibaba.fastjson2​:

<dependency>
    <groupId>com.alibaba.fastjson2</groupId>
    <artifactId>fastjson2</artifactId>
    <version>2.x.x</version>
</dependency>

fastjson v1​的兼容包

如果原来使用fastjson 1.2.x​版本,可以使用兼容包,兼容包不能保证100%兼容,请仔细测试验证,发现问题请及时反馈。

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>2.x.x</version>
</dependency>

2.2 序列化(Java对象转JSON字符串)

import com.alibaba.fastjson.JSON;

public class Example {
    public static void main(String[] args) {
        User user = new User("Alice", 30);
        String jsonString = JSON.toJSONString(user);
        System.out.println(jsonString);  // 输出: {"name":"Alice","age":30}
    }
}

class User {
    private String name;
    private int age;

    // 构造函数和getter、setter略
}

2.3 反序列化(JSON字符串转Java对象)

String jsonString = "{\"name\":\"Alice\",\"age\":30}";
User user = JSON.parseObject(jsonString, User.class);
System.out.println(user.getName());  // 输出: Alice

三、主要核心类

3.1 JSON类

简介

FastJSON 提供了几个核心类来处理 JSON 数据。在包中可以发现主要的3个类,JSON,JSONArray,JSONObject,三者之间的关系如下,JSONObject和JSONArray继承JSON

image

JSON类是 Fastjson 中最核心的类,提供了用于 JSON 数据处理的静态方法。

  • 常用方法

    • toJSON(Object obj)​:将 Java 对象转换为 JSON 对象。
    • toJSONString(Object obj)​:将 Java 对象序列化为 JSON 字符串。
    • parse(String text)​:将 JSON 字符串解析为 JSON 对象。
    • parseObject(String text, Class<T> clazz)​:将 JSON 字符串解析为指定类型的 Java 对象。

toJSONString(Object o)

这个方法平时最常见了,将JavaBean序列化成 JSON 文本

通过传入一个对象,便可以将对象转成 JSON 字符串,这里我们传入的不仅仅是 JavaBean 还可以是一个 Map 对象

传入一个 Map 对象 我们同样可以获取到一个 JSON 字符串。List 对象也很适用:

结果是一个标准的 JSONArray 的字符串

parseArray(String text)

这是一个将 JSON字符串 转为 JSONArray 的方法

  • parseObject(String text)

上面说到的是 序列化,那么对应的便是 反序列化

反序列化就是把JSON格式的字符串转化为Java Bean对象。

用法十分简单,可以将一个标准的 JSON 字符串 转为一个 JSONObject 对象,由于 JSONObject 类 实现了 Map 接口,因此我们可以通过 get()​ 来获取到值。

我们已经知道了 Map 的致命不足,所以我们更希望能得到一个 JavaBean 对象。

当然也是可以的!我们通过传入我们想要转换的对象类型,就可以得到我们想要的 JavaBean

3.2 JSONArray类

简介

JSONArray​ 是 Fastjson 库中用于表示 JSON 数组的类。它提供了多种方法来操作和管理 JSON 数组的数据。

  • 常用方法

    • add(Object value)​:向数组中添加一个元素。
    • get(int index)​:获取指定索引位置的元素。
    • size()​:返回数组的长度。
    • toJSONString()​:将 JSONArray​ 转换为 JSON 字符串。
    • toArray(Class<T> componentType)​:将 JSONArray​ 转换为指定类型的 Java 数组。
    • toList(Class<T> clazz)​:将 JSONArray​ 转换为指定类型的 Java 列表。

1. 创建 JSONArray

import com.alibaba.fastjson.JSONArray;

public class JSONArrayExample {
    public static void main(String[] args) {
        // 创建一个空的 JSONArray
        JSONArray jsonArray = new JSONArray();
  
        // 添加元素
        jsonArray.add("Hello");
        jsonArray.add(123);
        jsonArray.add(true);
  
        System.out.println(jsonArray);  // 输出: ["Hello",123,true]
    }
}

2. 从 JSON 字符串解析 JSONArray

import com.alibaba.fastjson.JSONArray;

public class ParseJSONArrayExample {
    public static void main(String[] args) {
        // 从 JSON 字符串解析 JSONArray
        String jsonString = "[\"Apple\", \"Banana\", \"Cherry\"]";
        JSONArray jsonArray = JSONArray.parseArray(jsonString);
  
        System.out.println(jsonArray);  // 输出: ["Apple","Banana","Cherry"]
    }
}

3. 访问 JSONArray 中的元素

import com.alibaba.fastjson.JSONArray;

public class AccessJSONArrayExample {
    public static void main(String[] args) {
        String jsonString = "[\"Apple\", \"Banana\", \"Cherry\"]";
        JSONArray jsonArray = JSONArray.parseArray(jsonString);
  
        // 获取元素
        String firstElement = jsonArray.getString(0);  // "Apple"
        String secondElement = jsonArray.getString(1); // "Banana"

        System.out.println(firstElement);  // 输出: Apple
        System.out.println(secondElement);  // 输出: Banana
    }
}

4. 遍历 JSONArray

import com.alibaba.fastjson.JSONArray;

public class IterateJSONArrayExample {
    public static void main(String[] args) {
        String jsonString = "[\"Apple\", \"Banana\", \"Cherry\"]";
        JSONArray jsonArray = JSONArray.parseArray(jsonString);
  
        // 遍历 JSONArray
        for (int i = 0; i < jsonArray.size(); i++) {
            System.out.println(jsonArray.getString(i));
        }
        // 输出:
        // Apple
        // Banana
        // Cherry
    }
}

5. 修改 JSONArray 中的元素

import com.alibaba.fastjson.JSONArray;

public class ModifyJSONArrayExample {
    public static void main(String[] args) {
        String jsonString = "[\"Apple\", \"Banana\", \"Cherry\"]";
        JSONArray jsonArray = JSONArray.parseArray(jsonString);
  
        // 修改元素
        jsonArray.set(1, "Blueberry");  // 将 "Banana" 修改为 "Blueberry"

        System.out.println(jsonArray);  // 输出: ["Apple","Blueberry","Cherry"]
    }
}

6. 删除 JSONArray 中的元素

import com.alibaba.fastjson.JSONArray;

public class RemoveFromJSONArrayExample {
    public static void main(String[] args) {
        String jsonString = "[\"Apple\", \"Banana\", \"Cherry\"]";
        JSONArray jsonArray = JSONArray.parseArray(jsonString);
  
        // 删除元素
        jsonArray.remove(1);  // 删除 "Banana"

        System.out.println(jsonArray);  // 输出: ["Apple","Cherry"]
    }
}

3.3 JSONObject类

简介

JSONObject类实现了Map接口,代表了一个JSON对象。它允许你通过键值对的方式存储和检索。

image

  • 常用方法

    • get(String key)​:获取指定键的值。
    • put(String key, Object value)​:添加或替换指定键的值。
    • getString(String key)​、getIntValue(String key)​ 等:获取特定类型的值。
    • fluentPut(String key, Object value)​:链式调用的方式添加键值对。
    • toJSONString()​:将 JSONObject​ 转换为 JSON 字符串。

1. 构造方法

  • JSONObject() : 创建一个空的 JSON 对象。
  • JSONObject(Map<?, ?> map) : 根据给定的映射创建 JSON 对象。

2. 添加和设置键值对

  • put(String key, Object value) : 添加或更新键值对。

    JSONObject jsonObject = new JSONObject();
    jsonObject.put("name", "Alice");
    jsonObject.put("age", 30);
    
  • putAll(Map<? extends String, ?> map) : 将一个映射中的所有键值对添加到 JSON 对象中。

    Map<String, Object> map = new HashMap<>();
    map.put("city", "Beijing");
    map.put("country", "China");
    jsonObject.putAll(map);
    

3. 获取值

  • get(String key) : 根据键获取对应的值。

    Object name = jsonObject.get("name");
    
  • getString(String key) : 根据键获取字符串类型的值。

    String name = jsonObject.getString("name");
    
  • getInteger(String key) : 根据键获取整数类型的值。

    Integer age = jsonObject.getInteger("age");
    
  • getJSONObject(String key) : 根据键获取 JSON 对象。

    JSONObject address = jsonObject.getJSONObject("address");
    
  • getJSONArray(String key) : 根据键获取 JSON 数组。

    JSONArray hobbies = jsonObject.getJSONArray("hobbies");
    

4. 删除键值对

  • remove(String key) : 删除指定键的键值对。

    jsonObject.remove("city");
    
  • clear() : 清空 JSON 对象中的所有键值对。

    jsonObject.clear();
    

5. 查询方法

  • containsKey(String key) : 检查 JSON 对象中是否包含指定的键。

    boolean hasName = jsonObject.containsKey("name");
    
  • size() : 返回 JSON 对象中键值对的数量。

    int size = jsonObject.size();
    

6. 转换

  • toJSONString() : 将 JSON 对象转换为 JSON 字符串。

    String jsonString = jsonObject.toJSONString();
    
  • toJavaObject(Class<T> clazz) : 将 JSON 对象转换为 Java 对象。

    Person person = jsonObject.toJavaObject(Person.class);
    

7. 其他方法

  • keySet() : 返回 JSON 对象中所有键的集合。

    Set<String> keys = jsonObject.keySet();
    
  • clone() : 克隆一个新的 JSONObject​。

    JSONObject clonedObject = jsonObject.clone();
    

示例

import com.alibaba.fastjson.JSONObject;

public class FastjsonExample {
    public static void main(String[] args) {
        // 创建一个 JSON 对象
        JSONObject jsonObject = new JSONObject();

        // 添加键值对
        jsonObject.put("name", "Alice");
        jsonObject.put("age", 30);
        jsonObject.put("city", "Beijing");

        // 打印 JSON 对象
        System.out.println("JSON Object: " + jsonObject.toJSONString());

        // 访问值
        String name = jsonObject.getString("name");
        Integer age = jsonObject.getInteger("age");
        System.out.println("Name: " + name);
        System.out.println("Age: " + age);

        // 修改值
        jsonObject.put("age", 31);
        System.out.println("Updated JSON Object: " + jsonObject.toJSONString());

        // 删除键值对
        jsonObject.remove("city");
        System.out.println("After removal: " + jsonObject.toJSONString());

        // 查询大小
        System.out.println("Size of object: " + jsonObject.size());
    }
}

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

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

相关文章

RabbitMQ系列学习笔记(九)--路由模式

文章目录 一、路由模式原理二、多重绑定三、路由模式实战1、消费者代码2、生产者代码3、运行结果分析 本文参考 尚硅谷RabbitMQ教程丨快速掌握MQ消息中间件rabbitmq RabbitMQ 详解 Centos7环境安装Erlang、RabbitMQ详细过程(配图) 一、路由模式原理 使用发布订阅模式时&#x…

C++ -string -常见用法5

博客主页&#xff1a;【夜泉_ly】 本文专栏&#xff1a;【C】 欢迎点赞&#x1f44d;收藏⭐关注❤️ 文章目录 &#x1f4a1;前言&#x1f4a1;非成员函数1.operator1.1函数原型1.2使用1.3注意 2.relational operators3.swap4.operator>>5.operator<<6.operator<…

Javascript算法(滑块窗口、螺旋矩阵)

滑块窗口 JS滑块窗口算法&#xff0c;即滑动窗口算法&#xff08;Sliding Window&#xff09;&#xff0c;在JavaScript中的应用场景主要集中在处理字符串和数组等数据结构中的子串或子数组问题。这种算法通过维护一个窗口&#xff0c;并移动窗口的两个边界&#xff08;左右指…

Linux命令进阶·vi\vim编辑器详细命令介绍

目录 1. 什么是 vim&#xff1f; 2. vi\vim 模式介绍 2.1 命令模式&#xff08;Command mode&#xff09; 2.2 输入模式&#xff08;Insert mode&#xff09; 2.3 底线命令模式&#xff08;Last line mode&#xff09; 3. vi\vim 的使用 4. 命令介绍 1. 什么是 …

微信小程序-自定义组件

文章目录 微信小程序-自定义组件概述创建和使用数据、方法和属性slot 插槽默认插槽具名插槽 组件样式注意项样式隔离 数据监听组件间通信父传子子传父获取子组件实例 生命周期组件的生命周期组件所在页面的生命周期App、Page与Component生命周期对比冷启动保留当前页面和关闭当…

诺奖印证产业方向,AI先行者晶泰科技开拓黄金赛道

2024年诺贝尔奖揭晓的各奖项中&#xff0c;AI领域无疑成为“最大赢家”。 从诺贝尔物理学奖被授予两名AI科学家&#xff0c;到诺贝尔化学奖表彰三位科学家“用人工智能&#xff08;AI&#xff09;破译蛋白质的密码”&#xff0c;本届诺贝尔奖“含AI量”之高引起市场热议。 值…

如何将 Elasticsearch 与流行的 Ruby 工具结合使用

作者&#xff1a;来自 Elastic Fernando Briano 了解如何将 Elasticsearch 与一些流行的 Ruby 库一起使用。 在这篇博文中&#xff0c;我们将介绍如何将 Elasticsearch 与一些流行的 Ruby 工具结合使用。我们将实现 Ruby 客户端 “入门”指南 中介绍的常用 API。如果你点击该链…

【从零开发Mybatis】引入XNode和XPathParser

引言 在上文&#xff0c;我们发现直接使用 DOM库去解析XML 配置文件&#xff0c;非常复杂&#xff0c;也很不方便&#xff0c;需要编写大量的重复代码来处理 XML 文件的读取和解析&#xff0c;代码可读性以及可维护性相当差&#xff0c;使用起来非常不灵活。 因此&#xff0c…

深度学习:对评论信息的情感分析,建立模型,自动识别评论信息的情绪状态完整代码实现

评论 思考&#xff1a;向模型中传递数据时&#xff0c;需要提前处理好数据 1、目标&#xff1a;将评论内容转换为词向量。 2、每个词/字转换为词向量长度(维度)200 3、每一次传入的词/字的个数是否就是评论的长度? 应该是固定长度&#xff0c;每次传入数据与图像相似…

DIY我的世界磁力方块

引子 小朋友喜欢我的世界&#xff0c;就像当年我那代对俄罗斯方块的执着&#xff0c;考虑电子游戏伤眼睛&#xff0c;所以最近开始给小朋友买磁力方块。 一个将近1元多的价格&#xff0c;催生我DIY的念头。 正文 Freecad图&#xff0c;A,B,C,D处 放磁铁 5.14g 材料费 最后的成…

Axure中继器单选、多选和重置

亲爱的小伙伴&#xff0c;在您浏览之前&#xff0c;烦请关注一下&#xff0c;在此深表感谢&#xff01; 课程主题&#xff1a;Axure中继器单选、多选和重置 主要内容&#xff1a;根据查询条件&#xff0c;通过单选、多选和重置&#xff0c;从中继器中得到数据 应用场景&…

DockerCompose快速部署Java项目、nginx前端和mysql数据库到centos虚拟机

简介&#xff1a;整理自&#xff1a;SpringCloud微服务开发与实战&#xff0c;java黑马商城项目微服务实战开发&#xff08;涵盖MybatisPlus、Docker、MQ、ES、Redis高级等&#xff09;课程的飞书文档。 DockerCompose介绍 大家可以看到&#xff0c;我们部署一个简单的java项…

stm32实现esp8266连接到TCP服务器(二)未完

1.2 连接到TCP Server 1.2.1 使用网络助手&#xff0c;设立TCP服务器 ​ 编辑 1.2.2 连接服务器 ATCIPSTART"TCP","192.168.1.18",8080 //指令&#xff0c;注意双引号逗号都要半角(英文)输入 CONNECT //结果&#xff1a;成功 OK //结果&#xff1a;成功 …

[C++]ecplise C++新建项目跑hello world

测试通过版本&#xff1a; ecplise-cpp 2024-09 ecplise-cpp 2020-09 【前提】 安装好MinGW环境&#xff0c;实际测试不需要下载什么CDT插件就可以运行了。 步骤&#xff1a; &#xff08;1&#xff09;打开ecplise,选择launch 选择File->New->C/C Project 选择C M…

Java_数组的使用

一、数组的介绍 数组可以存放多个同一类型的数据。数组也是一种数据类型&#xff0c;是引用类型。 即&#xff1a;数&#xff08;数据&#xff09;组&#xff08;一组&#xff09;就是一组数据 二、代码演示 public class Array01 {public static void main(String[] args) …

DMAIC赋能智能家居:解锁未来生活新篇章!

从清晨自动拉开的窗帘&#xff0c;到夜晚自动调暗的灯光&#xff0c;每一处细节都透露着科技的温度与智慧的光芒。而在这场智能革命的浪潮中&#xff0c;DMAIC&#xff08;定义Define、测量Measure、分析Analyze、改进Improve、控制Control&#xff09;作为六西格玛管理的核心方…

React之组件渲染性能优化

关键词&#xff1a; shouldComponentUpdate、PureComnent、React.memo、useMemo、useCallback shouldComponentUpdate 与 PureComnent shouldComponentUpdate 与 PureComnent 用于类组件。虽然官方推荐使用函数组件&#xff0c;但我们依然需要对类组件的渲染优化策略有所了解…

10 排序算法:冒泡排序与快速排序(算法原理、算法实现、时间和空间复杂度分析)

目录 1 十大常见的排序算法 1.1 算法的稳定性 2 冒泡排序 2.1 算法原理 2.2 算法实现 2.3 时间空间复杂度分析 2.3.1 时间复杂度分析 2.3.2 空间复杂度分析 3 快速排序 3.1 算法原理 3.1.1 排序思想 3.1.2 递归过程 3.2 示例 3.2.1 示例 1 3.2.2 示例 2 3.2.3 …

RHCE--网络服务

第一章 例行性工作 1、单一执行的例行性工作&#xff08;at&#xff09; 1.1 查看at命令 at的黑名单&#xff08;deny&#xff09;、白名单&#xff08;allow&#xff09;&#xff1b;两个文件若都不存在则只有root用户能使用 at工作调度对应的系统服务 atd&#xff1a;at的…

N9305高品质mp3音频语音芯片ic在早教故事机的应用方案

随着人们对教育的重视程度不断提高&#xff0c;儿童早教机已经成为了很多家庭的教育必备品。N9305音乐芯片在早教故事机中的应用&#xff0c;不仅为孩子们带来了丰富多彩的故事世界&#xff0c;还以其卓越的音质表现和功能&#xff0c;进一步提升了早教体验。 九芯电子N9305高品…