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