如何使用FastJSON

2024-08-28 16:12
文章标签 使用 fastjson

本文主要是介绍如何使用FastJSON,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

了解FastJSON

FastJSON的来源

FastJSON 的优点

FastJSON 的缺点

应用场景

如何使用FastJSON

添加依赖

1)Maven 项目中添加依赖

2)Gradle 项目中添加依赖

几种使用方式

1)解析 JSON 字符串为 Java 对象

2)处理嵌套的 JSON 结构(创建java对象)

3)处理嵌套的 JSON 结构(直接从 JSON 对象中获取值)

4)处理嵌套的 JSON 结构(使用路径表达式)


了解FastJSON

FastJSON的来源

FastJSON 是阿里巴巴弄出来的一个用 Java 语言写的处理 JSON 的工具。在 Java 开发里,处理 JSON 数据的需求可多了。阿里巴巴在弄那些企业级的应用和互联网服务的时候,就想要一个又快、功能又强还容易用的处理 JSON 的工具,所以他们的开发团队就搞出了 FastJSON。后来阿里巴巴把它开源了,让广大的 Java 开发者都能用,这样也能促进 Java 社区发展进步。随着时间变化,FastJSON 一直在发展完善,好多开发者都注意到它了,也爱用它,成了 Java 领域里很受欢迎的处理 JSON 的工具之一。

FastJSON 的优点
  1. 速度快:
    • 在众多 Java JSON 处理库中,FastJSON 以其高效的解析和生成 JSON 的速度而著称。它采用了一系列优化技术,如直接使用字节码生成技术、优化数据结构和算法等,使得在处理大规模 JSON 数据时具有明显的性能优势。
  1. 功能丰富:
    • 支持将 Java 对象与 JSON 字符串之间进行相互转换。可以将复杂的 Java 对象序列化为 JSON 字符串,也可以将 JSON 字符串反序列化为 Java 对象,包括自定义类、集合类型、嵌套结构等。
    • 支持多种数据类型的处理,包括基本数据类型、对象、数组、日期时间等。同时,还支持对 Java 对象中的字段进行灵活的配置,如忽略某些字段、指定字段的序列化和反序列化规则等。
  1. 易用性:
    • 提供了简洁的 API,使用起来非常方便。只需要几行代码就可以完成 Java 对象与 JSON 字符串之间的转换操作。例如,使用JSON.toJSONString(obj)可以将 Java 对象序列化为 JSON 字符串,使用JSON.parseObject(jsonStr, Class<T> clazz)可以将 JSON 字符串反序列化为 Java 对象。
  1. 兼容性:
    • 与其他 JSON 标准和库具有较好的兼容性。可以与其他基于 JSON 的系统和工具进行交互,例如与前端 JavaScript 框架进行数据交互、与数据库中的 JSON 数据进行操作等。
FastJSON 的缺点
  1. 安全问题:
    • 早期版本的时候,FastJSON 有一些安全漏洞,可能会被恶意弄的 JSON 数据攻击。虽然阿里巴巴一直在修这些漏洞,但用的时候还是得赶紧更新到最新版本,而且要注意检查输入的 JSON 数据是不是安全。
  1. 功能复杂性可能带来一些问题:
    • 由于 FastJSON 功能丰富,其配置选项也相对较多,对于一些新手开发者来说,可能需要花费一些时间来学习和理解这些配置选项。此外,在处理一些复杂的对象结构时,可能会出现一些意想不到的问题,需要开发者有一定的经验和调试能力。
  1. 社区支持相对有限:
    • 虽然 FastJSON 有一定的用户群体和社区支持,但与一些更广泛使用的开源项目相比,其社区规模可能相对较小。这可能导致在遇到一些问题时,获取帮助和解决方案的渠道相对有限。
应用场景
  1. Web 开发:
    • 在前后端分离的 Web 开发中,FastJSON 常用于将后端 Java 对象转换为 JSON 格式的数据,以便返回给前端进行展示或交互。同时,也可以将前端传来的 JSON 数据反序列化为 Java 对象,进行业务处理。
  1. 数据交换:
    • 当不同系统之间需要进行数据交换时,如果采用 JSON 作为数据格式,FastJSON 可以方便地进行数据的序列化和反序列化操作,确保数据在不同系统之间的正确传输和处理。
  1. 配置文件处理:
    • 一些应用程序可能使用 JSON 格式的配置文件。FastJSON 可以用来读取和解析这些配置文件,将其转换为 Java 对象,以便在应用程序中进行配置参数的获取和使用。
  1. 日志记录:
    • 在日志记录中,如果需要将复杂的对象信息以 JSON 格式记录下来,FastJSON 可以方便地将对象序列化为 JSON 字符串,然后写入日志文件或数据库中,方便后续的查询和分析。

如何使用FastJSON

添加依赖
1)Maven 项目中添加依赖

在 Maven 项目中使用 FastJSON,你可以在项目的 pom.xml 文件中添加以下依赖。

<dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.83</version>
</dependency>

2)Gradle 项目中添加依赖

在 build.gradle 文件中添加

implementation 'com.alibaba:fastjson:1.2.83'

几种使用方式
1)解析 JSON 字符串为 Java 对象

存在一个json字符串:{"name":"John","age":30,"isStudent":false}


//定义一个 Java 类来对应这个 JSON 结构
class Person {private String name;private int age;private boolean isStudent;// 生成相应的 getter 和 setter 方法
}

直接从 JSON 对象中获取值

import com.alibaba.fastjson.JSONObject;public class Main {public static void main(String[] args) {String jsonStr = "{\"name\":\"John\",\"age\":30,\"isStudent\":false}";JSONObject jsonObject = JSON.parseObject(jsonStr);String name = jsonObject.getString("name");int age = jsonObject.getInteger("age");boolean isStudent = jsonObject.getBooleanValue("isStudent");System.out.println("Name: " + name);System.out.println("Age: " + age);System.out.println("Is Student: " + isStudent);}
}

2)处理嵌套的 JSON 结构(创建java对象)

已知存在一个josn:{"person":{"name":"John","age":30},"address":{"city":"New York","country":"USA"}}

//定义对应的 Java 类
class Person {private String name;private int age;// getter 和 setter 方法
}class Address {private String city;private String country;// getter 和 setter 方法
}class RootObject {private Person person;private Address address;// getter 和 setter 方法
}

解析:

import com.alibaba.fastjson.JSON;public class Main {public static void main(String[] args) {String jsonStr = "{\"person\":{\"name\":\"John\",\"age\":30},\"address\":{\"city\":\"New York\",\"country\":\"USA\"}}";RootObject rootObject = JSON.parseObject(jsonStr, RootObject.class);Person person = rootObject.getPerson();Address address = rootObject.getAddress();String name = person.getName();int age = person.getAge();String city = address.getCity();String country = address.getCountry();System.out.println("Name: " + name);System.out.println("Age: " + age);System.out.println("City: " + city);System.out.println("Country: " + country);}
}

3)处理嵌套的 JSON 结构(直接从 JSON 对象中获取值)

存在json串:

{"user":{"name":"Alice","age":25,"address":{"city":"New York","country":"USA"}},"orders":[{"id":1,"product":"Book"},{"id":2,"product":"Pen"}]}

import com.alibaba.fastjson.JSONObject;public class Main {public static void main(String[] args) {String jsonStr = "{\"user\":{\"name\":\"Alice\",\"age\":25,\"address\":{\"city\":\"New York\",\"country\":\"USA\"}},\"orders\":[{\"id\":1,\"product\":\"Book\"},{\"id\":2,\"product\":\"Pen\"}]}";JSONObject jsonObject = JSON.parseObject(jsonStr);JSONObject userObject = jsonObject.getJSONObject("user");String userName = userObject.getString("name");int userAge = userObject.getInteger("age");JSONObject addressObject = userObject.getJSONObject("address");String city = addressObject.getString("city");String country = addressObject.getString("country");JSONArray ordersArray = jsonObject.getJSONArray("orders");for (int i = 0; i < ordersArray.size(); i++) {JSONObject orderObject = ordersArray.getJSONObject(i);int orderId = orderObject.getInteger("id");String product = orderObject.getString("product");System.out.println("Order ID: " + orderId + ", Product: " + product);}System.out.println("User Name: " + userName);System.out.println("User Age: " + userAge);System.out.println("City: " + city);System.out.println("Country: " + country);}
}

4)处理嵌套的 JSON 结构(使用路径表达式)

存在json串:

{"user":{"name":"Alice","age":25,"address":{"city":"New York","country":"USA"}},"orders":[{"id":1,"product":"Book"},{"id":2,"product":"Pen"}]}

import com.alibaba.fastjson.JSONPath;public class Main {public static void main(String[] args) {String jsonStr = "{\"user\":{\"name\":\"Alice\",\"age\":25,\"address\":{\"city\":\"New York\",\"country\":\"USA\"}},\"orders\":[{\"id\":1,\"product\":\"Book\"},{\"id\":2,\"product\":\"Pen\"}]}";String userName = (String) JSONPath.read(jsonStr, "$.user.name");int userAge = (int) JSONPath.read(jsonStr, "$.user.age");String city = (String) JSONPath.read(jsonStr, "$.user.address.city");String country = (String) JSONPath.read(jsonStr, "$.user.address.country");Object[] orders = JSONPath.read(jsonStr, "$.orders");for (Object order : orders) {int orderId = (int) JSONPath.read(order, "$.id");String product = (String) JSONPath.read(order, "$.product");System.out.println("Order ID: " + orderId + ", Product: " + product);}System.out.println("User Name: " + userName);System.out.println("User Age: " + userAge);System.out.println("City: " + city);System.out.println("Country: " + country);}
}

这篇关于如何使用FastJSON的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


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

相关文章

Python使用getopt处理命令行参数示例解析(最佳实践)

《Python使用getopt处理命令行参数示例解析(最佳实践)》getopt模块是Python标准库中一个简单但强大的命令行参数处理工具,它特别适合那些需要快速实现基本命令行参数解析的场景,或者需要... 目录为什么需要处理命令行参数?getopt模块基础实际应用示例与其他参数处理方式的比较常见问http

C 语言中enum枚举的定义和使用小结

《C语言中enum枚举的定义和使用小结》在C语言里,enum(枚举)是一种用户自定义的数据类型,它能够让你创建一组具名的整数常量,下面我会从定义、使用、特性等方面详细介绍enum,感兴趣的朋友一起看... 目录1、引言2、基本定义3、定义枚举变量4、自定义枚举常量的值5、枚举与switch语句结合使用6、枚

使用Python从PPT文档中提取图片和图片信息(如坐标、宽度和高度等)

《使用Python从PPT文档中提取图片和图片信息(如坐标、宽度和高度等)》PPT是一种高效的信息展示工具,广泛应用于教育、商务和设计等多个领域,PPT文档中常常包含丰富的图片内容,这些图片不仅提升了... 目录一、引言二、环境与工具三、python 提取PPT背景图片3.1 提取幻灯片背景图片3.2 提取

使用Python实现图像LBP特征提取的操作方法

《使用Python实现图像LBP特征提取的操作方法》LBP特征叫做局部二值模式,常用于纹理特征提取,并在纹理分类中具有较强的区分能力,本文给大家介绍了如何使用Python实现图像LBP特征提取的操作方... 目录一、LBP特征介绍二、LBP特征描述三、一些改进版本的LBP1.圆形LBP算子2.旋转不变的LB

Maven的使用和配置国内源的保姆级教程

《Maven的使用和配置国内源的保姆级教程》Maven是⼀个项目管理工具,基于POM(ProjectObjectModel,项目对象模型)的概念,Maven可以通过一小段描述信息来管理项目的构建,报告... 目录1. 什么是Maven?2.创建⼀个Maven项目3.Maven 核心功能4.使用Maven H

Python中__init__方法使用的深度解析

《Python中__init__方法使用的深度解析》在Python的面向对象编程(OOP)体系中,__init__方法如同建造房屋时的奠基仪式——它定义了对象诞生时的初始状态,下面我们就来深入了解下_... 目录一、__init__的基因图谱二、初始化过程的魔法时刻继承链中的初始化顺序self参数的奥秘默认

SpringBoot使用GZIP压缩反回数据问题

《SpringBoot使用GZIP压缩反回数据问题》:本文主要介绍SpringBoot使用GZIP压缩反回数据问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录SpringBoot使用GZIP压缩反回数据1、初识gzip2、gzip是什么,可以干什么?3、Spr

Spring Boot 集成 Quartz并使用Cron 表达式实现定时任务

《SpringBoot集成Quartz并使用Cron表达式实现定时任务》本篇文章介绍了如何在SpringBoot中集成Quartz进行定时任务调度,并通过Cron表达式控制任务... 目录前言1. 添加 Quartz 依赖2. 创建 Quartz 任务3. 配置 Quartz 任务调度4. 启动 Sprin

Linux下如何使用C++获取硬件信息

《Linux下如何使用C++获取硬件信息》这篇文章主要为大家详细介绍了如何使用C++实现获取CPU,主板,磁盘,BIOS信息等硬件信息,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下... 目录方法获取CPU信息:读取"/proc/cpuinfo"文件获取磁盘信息:读取"/proc/diskstats"文

Java使用SLF4J记录不同级别日志的示例详解

《Java使用SLF4J记录不同级别日志的示例详解》SLF4J是一个简单的日志门面,它允许在运行时选择不同的日志实现,这篇文章主要为大家详细介绍了如何使用SLF4J记录不同级别日志,感兴趣的可以了解下... 目录一、SLF4J简介二、添加依赖三、配置Logback四、记录不同级别的日志五、总结一、SLF4J