如何使用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使用try函数详解

《python使用try函数详解》Pythontry语句用于异常处理,支持捕获特定/多种异常、else/final子句确保资源释放,结合with语句自动清理,可自定义异常及嵌套结构,灵活应对错误场景... 目录try 函数的基本语法捕获特定异常捕获多个异常使用 else 子句使用 finally 子句捕获所

C++11右值引用与Lambda表达式的使用

《C++11右值引用与Lambda表达式的使用》C++11引入右值引用,实现移动语义提升性能,支持资源转移与完美转发;同时引入Lambda表达式,简化匿名函数定义,通过捕获列表和参数列表灵活处理变量... 目录C++11新特性右值引用和移动语义左值 / 右值常见的左值和右值移动语义移动构造函数移动复制运算符

Python对接支付宝支付之使用AliPay实现的详细操作指南

《Python对接支付宝支付之使用AliPay实现的详细操作指南》支付宝没有提供PythonSDK,但是强大的github就有提供python-alipay-sdk,封装里很多复杂操作,使用这个我们就... 目录一、引言二、准备工作2.1 支付宝开放平台入驻与应用创建2.2 密钥生成与配置2.3 安装ali

C#中lock关键字的使用小结

《C#中lock关键字的使用小结》在C#中,lock关键字用于确保当一个线程位于给定实例的代码块中时,其他线程无法访问同一实例的该代码块,下面就来介绍一下lock关键字的使用... 目录使用方式工作原理注意事项示例代码为什么不能lock值类型在C#中,lock关键字用于确保当一个线程位于给定实例的代码块中时

MySQL 强制使用特定索引的操作

《MySQL强制使用特定索引的操作》MySQL可通过FORCEINDEX、USEINDEX等语法强制查询使用特定索引,但优化器可能不采纳,需结合EXPLAIN分析执行计划,避免性能下降,注意版本差异... 目录1. 使用FORCE INDEX语法2. 使用USE INDEX语法3. 使用IGNORE IND

C# $字符串插值的使用

《C#$字符串插值的使用》本文介绍了C#中的字符串插值功能,详细介绍了使用$符号的实现方式,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧... 目录$ 字符使用方式创建内插字符串包含不同的数据类型控制内插表达式的格式控制内插表达式的对齐方式内插表达式中使用转义序列内插表达式中使用

flask库中sessions.py的使用小结

《flask库中sessions.py的使用小结》在Flask中Session是一种用于在不同请求之间存储用户数据的机制,Session默认是基于客户端Cookie的,但数据会经过加密签名,防止篡改,... 目录1. Flask Session 的基本使用(1) 启用 Session(2) 存储和读取 Se

Java Thread中join方法使用举例详解

《JavaThread中join方法使用举例详解》JavaThread中join()方法主要是让调用改方法的thread完成run方法里面的东西后,在执行join()方法后面的代码,这篇文章主要介绍... 目录前言1.join()方法的定义和作用2.join()方法的三个重载版本3.join()方法的工作原

Spring AI使用tool Calling和MCP的示例详解

《SpringAI使用toolCalling和MCP的示例详解》SpringAI1.0.0.M6引入ToolCalling与MCP协议,提升AI与工具交互的扩展性与标准化,支持信息检索、行动执行等... 目录深入探索 Spring AI聊天接口示例Function CallingMCPSTDIOSSE结束语

Linux系统之lvcreate命令使用解读

《Linux系统之lvcreate命令使用解读》lvcreate是LVM中创建逻辑卷的核心命令,支持线性、条带化、RAID、镜像、快照、瘦池和缓存池等多种类型,实现灵活存储资源管理,需注意空间分配、R... 目录lvcreate命令详解一、命令概述二、语法格式三、核心功能四、选项详解五、使用示例1. 创建逻