赞
踩
阿里巴巴开发的开源JSON解析库,由Java语言编写,它主要被设计用于将 Java 对象与 JSON 数据进行相互转换。
PS:它是一个专注于JSON格式的Java库。Fastjson的主要功能包括JSON序列化和反序列化,即可以将Java对象转换为JSON格式的字符串,也可以将JSON字符串转换为Java对象。
- <dependency>
- <groupId>com.alibaba</groupId>
- <artifactId>fastjson</artifactId>
- <version>1.2.83</version><!--这里以1.2.83为例-->
- </dependency>
PS:某些版本可能存在安全漏洞,因此在使用时需要确保使用的是最新且已修复漏洞的版本。
工具类,提供了一系列的静态方法来序列化和反序列化JSON(对象和数组)字符串和Java对象之间的转换。
作用:将Java对象序列化为JSON格式的对象或数组字符串。
返回值:序列化后的JSON格式的对象或数组字符串。
示例:
- User user = new User();
- user.setName("张三");
- user.setAge(25);
- // 将对象转为JSON格式的对象字符串
- String jsonString = JSON.toJSONString(user);
-
- List<User> userList = new ArrayList<>();
- userList.add(new User("王二", 25));
- userList.add(new User("张三", 30));
- userList.add(new User("李四", 35));
- // 将集合对象转为JSON格式的数组字符串
- String jsonArrayString = JSON.toJSONString(userList);
作用:
返回值:
示例:
作用:将JSON对象字符串反序列化为Java对象。
返回值:反序列化后的Java对象。
示例:
- String jsonString = "{\"name\":\"Alice\",\"age\":25}";
- User user = JSON.parseObject(jsonString, User.class);
PS:User 类中的字段名称必须与 JSON 字符串中的键名称相匹配,否则无法正确映射。
作用:将JSON格式的数组字符串反序列化为集合,不需要指定集合中元素的类型。
返回值:反序列化后的Java集合,集合中的元素类型为Object类型。
示例:
- String jsonText = "[{\"name\": \"Alice\", \"age\": 25},{\"name\": \"Bob\", \"hobby\": \"swimming\"},\"Hello, World!\"]";
- List<Object> objectList = JSON.parseArray(jsonText);
PS:这种方法在你不知道或者不关心数组中元素的具体类型时非常有用。
作用:将JSON格式的数组字符串反序列化为Java中的集合对象,需要指定集合中元素的类型。
返回值:反序列化后的Java集合,集合中元素的类型为指定的类型。
示例:
- String jsonString = "[{\"name\":\"张三\",\"age\":25},{\"name\":\"李四\",\"age\":30}]";
- List<User> userList = JSON.parseArray(jsonString, User.class);
补充:将JSON字符串反序列化为Java中的数组
说明:fastJson中JSON类并没有直接提供一个将 JSON 字符串转换为 Java 数组的方法,但可以先将 JSON 数组字符串转换为 JSONArray,然后从中提取数据并转换为 Java 数组。
示例:
- String jsonString = "[\"Alice\", \"Bob\", \"Charlie\"]";
-
- // 使用 parseArray 方法将 JSON 数组字符串转换为 JSONArray
- JSONArray jsonArray = JSON.parseArray(jsonString);
-
- // 将 JSONArray 转换为 Java 数组
- String[] names = new String[jsonArray.size()];
- for (int i = 0; i < jsonArray.size(); i++) {
- names[i] = jsonArray.getString(i);
- }
作用:验证JSON字符串的有效性。
返回值:返回值为boolean类型,JSON字符串有效返回true,否则返回false。
示例:
- String validJson = "{\"name\":\"Alice\",\"age\":25}";
- String invalidJson = "This is not JSON";
-
- boolean isValid = JSON.isValid(validJson); // true
- boolean isInvalid = JSON.isValid(invalidJson); // false
public static final Object parse(String text); // 将JSON文本解析为JSONObject或JSONArray
public static final JSONObject parseObject(String text); // 将JSON文本解析为JSONObject
public static final <T> T parseObject(String text, Class<T> clazz); // 将JSON文本解析为JavaBean
public static final String toJSONString(Object object); // 将JavaBean序列化为JSON文本
使用 TypeReference
处理泛型类型.....
// 将 JSON 字符串转换为 List<User> 对象 ...
- String jsonString = "[{\"name\":\"Alice\"},{\"name\":\"Bob\"}]";
- List<User> userList = JSON.parseObject(jsonString, new TypeReference<List<User>>() {});
前置:
将传入的JSON格式数据转为JSONObject示例:
- import com.alibaba.fastjson.JSONObject;
-
- public class FastJsonExample {
- public static void main(String[] args) {
- // JSON 格式的字符串
- String jsonString = "{\"name\":\"John\", \"age\":30, \"city\":\"New York\"}";
-
- // 使用 fastjson 的 JSON.parseObject() 方法将字符串转换为 JSONObject
- JSONObject jsonObject = JSON.parseObject(jsonString);
- }
用于处理JSON对象的类。继承自JSON类,并且实现了Map<String,Object>接口,数据结构为键值对的形式(通过键获取值)。
- import com.alibaba.fastjson.JSONObject;
-
- public class FastJsonExample {
- public static void main(String[] args) {
- String jsonString = "{\"name\":\"John\",\"age\":30,\"married\":false}";
- JSONObject jsonObject = JSONObject.parseObject(jsonString);
- String name = jsonObject.getString("name");
- int age = jsonObject.getIntValue("age");
- boolean married = jsonObject.getBoolean("married");
- System.out.println("Name: " + name + ", Age: " + age + ", Married: " + married);
- }
- }
特别说明:因fastJson主要是为了处理序列化和反序列化,对于Map接口的方法实现可能在方法内直接调用其它Map实现类的方法。但对于我们使用者来说,无需太过关注底层实现(fastjson是开源的,可能在不同版本底层实现会有所不同)。
作用:添加(或修改)一个键值对。
返回值:先前的值(Object类型),如果键已经存在则返回该键对应的旧值,否则返回null。
示例:
Object previousValue = jsonObject.put("name", "John");
作用:移除指定的键及其对应的值,如果键不存在则返回null。
返回值:移除的键对应的值(Object类型)。
示例:
Object removedValue = jsonObject.remove("keyName");
作用:根据给定的键(key)获取对应的值(value)。如果键不存在,则返回null。
返回值:具体键对于的值(Object类型)。
示例:
Object value = jsonObject.get("keyName");
作用:提供了类型安全的方法来获取特定类型的值。如果键不存在或值无法转换为请求的类型,这些方法将抛出异常。
返回值:根据调用的get***的方法获取特定类型的值。
示例:
- // 根据给定key获取对象中的String
- String strValue = jsonObject.getString("keyName");
- // 根据给定key获取对象中的Integer
- Integer intValue = jsonObject.getInteger("keyName");
- // 其它Java的类型就不再举例...
-
- // 根据给定key获取对象中的JSONObject
- JSONObject subObj = jsonObject.getJSONObject("subKeyName");
- // 根据给定key获取对象中的JSONArray
- JSONArray array = jsonObject.getJSONArray("arrayKeyName");
作用:获取所有键集合。
返回值:Set集合类型的键集合。
示例:
- Set<String> keySet = jsonObject.keySet();
-
- // 遍历 keySet
- for (String key : keySet) {
- System.out.println("Key: " + key);
- // 你也可以同时获取并打印对应的值
- Object value = jsonObject.get(key);
- System.out.println("Value: " + value);
- }
作用:获取JSONObject中键值对的数量。
返回值:键值对的数量。
示例:
int size = jsonObject.size();
作用:判断JSONObject是否包含指定的键。
返回值:一个boolean值。
示例:
boolean contains = jsonObject.containsKey("keyName");
containsValue(Object value)
作用:判断JSONObject是否包含指定的值(此方法可能需要遍历整个JSONObject,因此效率可能较低)。
返回值:一个boolean值。
示例:
boolean contains = jsonObject.containsValue(someValue);
作用:移除JSON对象中的所有键值对。
返回值:无。
示例:
jsonObject.clear();
作用:将JSONObject对象转换为JSON格式的字符串。
返回值:转换后JSON字符串。
示例:
String jsonString = jsonObject.toJSONString();
用于处理JSON数组的类,继承自JSON类,并且实现了List<Object>接口,数据结构为集合的形式(通过下标获取值)。
作用:
返回值:
示例:
jsonArray.add("element");
get
size
作用:将JSONArray转换为JSON字符串。
返回值:转换后JSON字符串。
示例:
String jsonString = jsonArray.toJSONString();
作用:将JSONArray转换为Java数组。
返回值:转换后的Object数组。
示例:
Object[] objects = jsonArray.toArray();
作用:将JSONArray转换为Java集合。
返回值:转换后的Java List。
示例:
List<Object> list = (List<Object>) JSONArray.toJavaList(jsonArray);
注解(Annotation)是一种用于为Java代码提供元数据的机制,它允许开发者在编译时为类、方法、变量等添加额外的信息,这些信息可以在运行时通过反射机制获取。fastjson提供了几种特定的注解,用于控制JSON序列化和反序列化的行为。
fastjson主要提供了以下几种注解:
@JSONType
:用于JavaBean上,可以规定哪些字段需要忽略或者需要包含,以及配置特性。@JSONField
:用于JavaBean的具体字段或者方法上,可以修改某个属性的输出名称,规定其支持序列化或者反序列化与否以及规定序列化顺序。@JSONCreator
:用于构造方法上,标识这个构造方法是用于反序列化的。@JSONPOJOBuilder
:用于构建者模式(Builder Pattern)的类上,标识这个类是用于构建JavaBean的。以@JSONField
为例,其主要参数包括:
name
:用于指定序列化后的JSON字段名或反序列化时的JSON字段名。例如:@JSONField(name="project_name")
。format
:当字段类型为Date
时,用于指定日期时间的格式化字符串。serialize
:用于指定该字段是否参与序列化。当值为false
时,该字段不会被序列化到JSON中。deserialize
:用于指定该字段是否参与反序列化。当值为false
时,该字段在反序列化时不会被赋值。serialzeFeatures
:这是一个SerializerFeature
类型的枚举数组,用于指定该字段的序列化特性。例如,@JSONField(serialzeFeatures=SerializerFeature.WriteMapNullValue)
表示当该字段的值为null
时,仍然会将其序列化到JSON中。请注意,以上参数并非@JSONField
的全部参数,fastjson的注解还提供了许多其他功能和选项,可以根据具体需求进行配置。此外,@JSONType
、@JSONCreator
和@JSONPOJOBuilder
等注解也有各自特定的参数和用法。建议查阅fastjson的官方文档或相关教程以获取更详细的信息。
无需了解,快速上手使用。
JSON有两种基本结构:JSON对象和JSON数组。
明天补充示例---Java对象中包含对象转为JSON对象,JSON中对象中包含对象转为Java
JSON数组中的数组转为Java,JSON数组中的对象转为Java
还有一大堆JSON数组的示例...
示例(序列化)代码如下所示:
- import com.alibaba.fastjson.JSON;
-
- public class Main {
- public static void main(String[] args) {
- // 创建要序列化的对象
- User user = new User("John", "Doe");
-
- // 使用fastjson进行序列化
- String jsonStr = JSON.toJSONString(user);
-
- System.out.println(jsonStr);
- }
- }
-
- class User {
- private String firstName;
- private String lastName;
-
- public User() {}
-
- public User(String firstName, String lastName) {
- this.firstName = firstName;
- this.lastName = lastName;
- }
-
- // Getters and setters
- }

输出结果:{"firstName":"John","lastName":"Doe"}
示例(反序列化)代码如下所示:
- import com.alibaba.fastjson.JSON;
-
- public class Main {
- public static void main(String[] args) {
- // 定义包含JSON数据的字符串
- String jsonStr = "{\"firstName\":\"John\", \"lastName\":\"Doe\"}";
-
- // 使用fastjson进行反序列化
- User user = JSON.parseObject(jsonStr, User.class);
-
- System.out.println(user.getFirstName());
- System.out.println(user.getLastName());
- }
- }
-
- class User {
- private String firstName;
- private String lastName;
-
- public User() {}
-
- public User(String firstName, String lastName) {
- this.firstName = firstName;
- this.lastName = lastName;
- }
-
- // Getters and setters
- }

输出结果:
John
Doe
- import com.alibaba.fastjson.JSON;
- import com.alibaba.fastjson.JSONObject;
-
- public class Main {
- public static void main(String[] args) {
- // JSON字符串
- String jsonStr = "{\"name\":\"John\", \"age\":30}";
-
- // 将JSON字符串转换为JSON对象
- JSONObject jsonObj = JSON.parseObject(jsonStr);
-
- // 通过键名获取值
- String name = jsonObj.getString("name");
- int age = jsonObj.getIntValue("age");
-
- System.out.println("Name: " + name);
- System.out.println("Age: " + age);
- }
- }

输出结果:
Name: John
Age: 30
- import com.alibaba.fastjson.JSON;
- import com.alibaba.fastjson.JSONObject;
- import com.alibaba.fastjson.JSONArray;
-
- public class Main {
- public static void main(String[] args) {
- // JSON字符串,数组
- String jsonStr = "{\"firstName\":\"John\", \"lastName\":\"Doe\" ," +
- "\"array\":[\"唱\",\"跳\",\"rap\"]}";
-
- // 将JSON字符串转换为JSON对象
- JSONObject jsonObj = JSON.parseObject(jsonStr);
-
- // 通过键名获取值
- String firstName = jsonObj.getString("firstName");
- String lastName = jsonObj.getString("lastName");
- JSONArray jsonArray = jsonArray.getJSONArray("array");
- for (int i = 0; i < jsonArray.size(); i++) {
- Object value = jsonArray.get(i);
-
- System.out.println(value);
- }
-
- System.out.println(firstName);
- System.out.println(lastName);
- }
- }

输出结果:
唱
跳
rap
John
Doe
- import com.alibaba.fastjson.JSON;
- import com.alibaba.fastjson.JSONObject;
- import com.alibaba.fastjson.JSONArray;
-
- public class Main {
- public static void main(String[] args) {
- // JSON数组-多个json对象
- String jsonStr = "{\"array\":[{\"name\":\"张三\",\"sex\":\"男\"}," +
- "{\"name\":\"李四\",\"sex\":\"女\"}]}";
-
- // 将JSON字符串转换为JSON对象
- JSONObject jsonObj = JSON.parseObject(jsonStr);
-
- // 通过键名获取值
- JSONArray jsonArray = jsonArray.getJSONArray("array");
- for (int i = 0; i < jsonArray.size(); i++) {
- JSONObject json = JSON.parseObject(jsonArray.get(i).toString());
- String name = json.getString("name");
- String sex = json.getString("sex");
-
- System.out.println(name);
- System.out.println(sex);
- }
- }
- }

输出结果:
张三
男
李四
女
JSON是什么?以及JSON结构的说明。
序列化和反序列
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。