当前位置:   article > 正文

一文搞定FastJSON库(持续更新中...)_fastjson格式化json

fastjson格式化json

是什么

阿里巴巴开发的开源JSON解析库,由Java语言编写,它主要被设计用于将 Java 对象与 JSON 数据进行相互转换。

PS:它是一个专注于JSON格式的Java库。Fastjson的主要功能包括JSON序列化和反序列化,即可以将Java对象转换为JSON格式的字符串,也可以将JSON字符串转换为Java对象。


依赖

  1. <dependency>
  2. <groupId>com.alibaba</groupId>
  3. <artifactId>fastjson</artifactId>
  4. <version>1.2.83</version><!--这里以1.2.83为例-->
  5. </dependency>

PS:某些版本可能存在安全漏洞,因此在使用时需要确保使用的是最新且已修复漏洞的版本。


核心类

JSON

工具类,提供了一系列的静态方法来序列化和反序列化JSON(对象和数组)字符串和Java对象之间的转换。

常用方法

toJSONString(Object object)

作用:将Java对象序列化为JSON格式的对象或数组字符串。

返回值:序列化后的JSON格式的对象或数组字符串。

示例:

  1. User user = new User();
  2. user.setName("张三");
  3. user.setAge(25);
  4. // 将对象转为JSON格式的对象字符串
  5. String jsonString = JSON.toJSONString(user);
  6. List<User> userList = new ArrayList<>();
  7. userList.add(new User("王二", 25));
  8. userList.add(new User("张三", 30));
  9. userList.add(new User("李四", 35));
  10. // 将集合对象转为JSON格式的数组字符串
  11. String jsonArrayString = JSON.toJSONString(userList);

  • 注意:。(看一下这个反序列化对象或数组,如果不匹配会发生什么问题,搜一下)


parseObject(String text)

作用:

返回值:

示例:


parseObject(String text, Class<T> clazz)

作用:将JSON对象字符串反序列化为Java对象。

返回值:反序列化后的Java对象。

示例:

  1. String jsonString = "{\"name\":\"Alice\",\"age\":25}";
  2. User user = JSON.parseObject(jsonString, User.class);

PS:User 类中的字段名称必须与 JSON 字符串中的键名称相匹配,否则无法正确映射。


parseArray(String text)

作用:将JSON格式的数组字符串反序列化为集合,不需要指定集合中元素的类型。

返回值:反序列化后的Java集合,集合中的元素类型为Object类型。

示例:

  1. String jsonText = "[{\"name\": \"Alice\", \"age\": 25},{\"name\": \"Bob\", \"hobby\": \"swimming\"},\"Hello, World!\"]";
  2. List<Object> objectList = JSON.parseArray(jsonText);

PS:这种方法在你不知道或者不关心数组中元素的具体类型时非常有用。


parseArray(String text, Class<T> clazz)

作用:将JSON格式的数组字符串反序列化为Java中的集合对象,需要指定集合中元素的类型。

返回值:反序列化后的Java集合,集合中元素的类型为指定的类型。

示例:

  1. String jsonString = "[{\"name\":\"张三\",\"age\":25},{\"name\":\"李四\",\"age\":30}]";
  2. List<User> userList = JSON.parseArray(jsonString, User.class);

补充:将JSON字符串反序列化为Java中的数组

说明:fastJson中JSON类并没有直接提供一个将 JSON 字符串转换为 Java 数组的方法,但可以先将 JSON 数组字符串转换为 JSONArray,然后从中提取数据并转换为 Java 数组。

示例:

  1. String jsonString = "[\"Alice\", \"Bob\", \"Charlie\"]";
  2. // 使用 parseArray 方法将 JSON 数组字符串转换为 JSONArray
  3. JSONArray jsonArray = JSON.parseArray(jsonString);
  4. // 将 JSONArray 转换为 Java 数组
  5. String[] names = new String[jsonArray.size()];
  6. for (int i = 0; i < jsonArray.size(); i++) {
  7. names[i] = jsonArray.getString(i);
  8. }


isValid(String text)

作用:验证JSON字符串的有效性。

返回值:返回值为boolean类型,JSON字符串有效返回true,否则返回false。

示例:

  1. String validJson = "{\"name\":\"Alice\",\"age\":25}";
  2. String invalidJson = "This is not JSON";
  3. boolean isValid = JSON.isValid(validJson); // true
  4. 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> 对象 ...

  1. String jsonString = "[{\"name\":\"Alice\"},{\"name\":\"Bob\"}]";
  2. List<User> userList = JSON.parseObject(jsonString, new TypeReference<List<User>>() {});

前置:

将传入的JSON格式数据转为JSONObject示例:

  1. import com.alibaba.fastjson.JSONObject;
  2. public class FastJsonExample {
  3. public static void main(String[] args) {
  4. // JSON 格式的字符串
  5. String jsonString = "{\"name\":\"John\", \"age\":30, \"city\":\"New York\"}";
  6. // 使用 fastjson 的 JSON.parseObject() 方法将字符串转换为 JSONObject
  7. JSONObject jsonObject = JSON.parseObject(jsonString);
  8. }


JSONObject

用于处理JSON对象的类。继承自JSON类,并且实现了Map<String,Object>接口,数据结构为键值对的形式(通过键获取值)。

  1. import com.alibaba.fastjson.JSONObject;
  2. public class FastJsonExample {
  3. public static void main(String[] args) {
  4. String jsonString = "{\"name\":\"John\",\"age\":30,\"married\":false}";
  5. JSONObject jsonObject = JSONObject.parseObject(jsonString);
  6. String name = jsonObject.getString("name");
  7. int age = jsonObject.getIntValue("age");
  8. boolean married = jsonObject.getBoolean("married");
  9. System.out.println("Name: " + name + ", Age: " + age + ", Married: " + married);
  10. }
  11. }

常用方法

特别说明:因fastJson主要是为了处理序列化和反序列化,对于Map接口的方法实现可能在方法内直接调用其它Map实现类的方法。但对于我们使用者来说,无需太过关注底层实现(fastjson是开源的,可能在不同版本底层实现会有所不同)。

put(String key, Object value)

作用:添加(或修改)一个键值对。

返回值:先前的值(Object类型),如果键已经存在则返回该键对应的旧值,否则返回null。

示例:

Object previousValue = jsonObject.put("name", "John");

remove(Object key)

作用:移除指定的键及其对应的值,如果键不存在则返回null。

返回值:移除的键对应的值(Object类型)。

示例:

Object removedValue = jsonObject.remove("keyName"); 

get(String key)

作用:根据给定的键(key)获取对应的值(value)。如果键不存在,则返回null。

返回值:具体键对于的值(Object类型)。

示例:

Object value = jsonObject.get("keyName");

get***系列

作用:提供了类型安全的方法来获取特定类型的值。如果键不存在或值无法转换为请求的类型,这些方法将抛出异常。

返回值:根据调用的get***的方法获取特定类型的值。

示例:

  1. // 根据给定key获取对象中的String
  2. String strValue = jsonObject.getString("keyName");
  3. // 根据给定key获取对象中的Integer
  4. Integer intValue = jsonObject.getInteger("keyName");
  5. // 其它Java的类型就不再举例...
  6. // 根据给定key获取对象中的JSONObject
  7. JSONObject subObj = jsonObject.getJSONObject("subKeyName");
  8. // 根据给定key获取对象中的JSONArray
  9. JSONArray array = jsonObject.getJSONArray("arrayKeyName");

KeySet()

作用:获取所有键集合。

返回值:Set集合类型的键集合。

示例:

  1. Set<String> keySet = jsonObject.keySet();
  2. // 遍历 keySet
  3. for (String key : keySet) {
  4. System.out.println("Key: " + key);
  5. // 你也可以同时获取并打印对应的值
  6. Object value = jsonObject.get(key);
  7. System.out.println("Value: " + value);
  8. }

size()

作用:获取JSONObject中键值对的数量。

返回值:键值对的数量。

示例:

int size = jsonObject.size();

containsKey(Object key)

作用:判断JSONObject是否包含指定的键。

返回值:一个boolean值。

示例:

boolean contains = jsonObject.containsKey("keyName");

containsValue(Object value)

作用:判断JSONObject是否包含指定的值(此方法可能需要遍历整个JSONObject,因此效率可能较低)。

返回值:一个boolean值。

示例:

boolean contains = jsonObject.containsValue(someValue);

clear()

作用:移除JSON对象中的所有键值对。

返回值:无。

示例:

jsonObject.clear();

toJSONString()

作用:将JSONObject对象转换为JSON格式的字符串。

返回值:转换后JSON字符串。

示例:

String jsonString = jsonObject.toJSONString();

JSONArray

用于处理JSON数组的类,继承自JSON类,并且实现了List<Object>接口,数据结构为集合的形式(通过下标获取值)。

常用方法

add(Object value)

作用:

返回值:

示例:

jsonArray.add("element");

get

size

toJSONString()

作用:将JSONArray转换为JSON字符串。

返回值:转换后JSON字符串。

示例:

String jsonString = jsonArray.toJSONString();  


toArray()

作用:将JSONArray转换为Java数组。

返回值:转换后的Object数组。

示例:

Object[] objects = jsonArray.toArray();

toJavaList(JSONArray jsonArray)

作用:将JSONArray转换为Java集合。

返回值:转换后的Java List。

示例:

List<Object> list = (List<Object>) JSONArray.toJavaList(jsonArray);


注解

注解(Annotation)是一种用于为Java代码提供元数据的机制,它允许开发者在编译时为类、方法、变量等添加额外的信息,这些信息可以在运行时通过反射机制获取。fastjson提供了几种特定的注解,用于控制JSON序列化和反序列化的行为。

1. fastjson中的注解

fastjson主要提供了以下几种注解:

  • @JSONType:用于JavaBean上,可以规定哪些字段需要忽略或者需要包含,以及配置特性。
  • @JSONField:用于JavaBean的具体字段或者方法上,可以修改某个属性的输出名称,规定其支持序列化或者反序列化与否以及规定序列化顺序。
  • @JSONCreator:用于构造方法上,标识这个构造方法是用于反序列化的。
  • @JSONPOJOBuilder:用于构建者模式(Builder Pattern)的类上,标识这个类是用于构建JavaBean的。

2. 注解的作用

  • 控制序列化和反序列化的行为:通过注解,可以指定哪些字段需要被序列化或反序列化,哪些字段需要被忽略。
  • 自定义字段名称:在JSON和JavaBean之间映射时,可以使用注解来指定字段的别名。
  • 指定序列化顺序:可以通过注解来指定字段的序列化顺序。
  • 支持复杂的JSON结构:例如,对于嵌套的JSON对象或数组,可以使用注解来指导fastjson如何正确地解析它们。

3. 注解的具体参数说明

@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数组的示例...


Java对象转换为JSON对象

示例(序列化)代码如下所示:

  1. import com.alibaba.fastjson.JSON;
  2. public class Main {
  3. public static void main(String[] args) {
  4. // 创建要序列化的对象
  5. User user = new User("John", "Doe");
  6. // 使用fastjson进行序列化
  7. String jsonStr = JSON.toJSONString(user);
  8. System.out.println(jsonStr);
  9. }
  10. }
  11. class User {
  12. private String firstName;
  13. private String lastName;
  14. public User() {}
  15. public User(String firstName, String lastName) {
  16. this.firstName = firstName;
  17. this.lastName = lastName;
  18. }
  19. // Getters and setters
  20. }

输出结果:{"firstName":"John","lastName":"Doe"}


JSON对象转换为Java对象

示例(反序列化)代码如下所示:

  1. import com.alibaba.fastjson.JSON;
  2. public class Main {
  3. public static void main(String[] args) {
  4. // 定义包含JSON数据的字符串
  5. String jsonStr = "{\"firstName\":\"John\", \"lastName\":\"Doe\"}";
  6. // 使用fastjson进行反序列化
  7. User user = JSON.parseObject(jsonStr, User.class);
  8. System.out.println(user.getFirstName());
  9. System.out.println(user.getLastName());
  10. }
  11. }
  12. class User {
  13. private String firstName;
  14. private String lastName;
  15. public User() {}
  16. public User(String firstName, String lastName) {
  17. this.firstName = firstName;
  18. this.lastName = lastName;
  19. }
  20. // Getters and setters
  21. }

输出结果:

John

Doe


获取JSON对象中(字符串,数值)

  1. import com.alibaba.fastjson.JSON;
  2. import com.alibaba.fastjson.JSONObject;
  3. public class Main {
  4. public static void main(String[] args) {
  5. // JSON字符串
  6. String jsonStr = "{\"name\":\"John\", \"age\":30}";
  7. // 将JSON字符串转换为JSON对象
  8. JSONObject jsonObj = JSON.parseObject(jsonStr);
  9. // 通过键名获取值
  10. String name = jsonObj.getString("name");
  11. int age = jsonObj.getIntValue("age");
  12. System.out.println("Name: " + name);
  13. System.out.println("Age: " + age);
  14. }
  15. }

输出结果:

Name: John

Age: 30

获取JSON对象中(字符串,数组)

  1. import com.alibaba.fastjson.JSON;
  2. import com.alibaba.fastjson.JSONObject;
  3. import com.alibaba.fastjson.JSONArray;
  4. public class Main {
  5. public static void main(String[] args) {
  6. // JSON字符串,数组
  7. String jsonStr = "{\"firstName\":\"John\", \"lastName\":\"Doe\" ," +
  8. "\"array\":[\"唱\",\"跳\",\"rap\"]}";
  9. // 将JSON字符串转换为JSON对象
  10. JSONObject jsonObj = JSON.parseObject(jsonStr);
  11. // 通过键名获取值
  12. String firstName = jsonObj.getString("firstName");
  13. String lastName = jsonObj.getString("lastName");
  14. JSONArray jsonArray = jsonArray.getJSONArray("array");
  15. for (int i = 0; i < jsonArray.size(); i++) {
  16. Object value = jsonArray.get(i);
  17. System.out.println(value);
  18. }
  19. System.out.println(firstName);
  20. System.out.println(lastName);
  21. }
  22. }

输出结果:



rap
John
Doe

获取JSON对象中(数组-包含多个json对象)

  1. import com.alibaba.fastjson.JSON;
  2. import com.alibaba.fastjson.JSONObject;
  3. import com.alibaba.fastjson.JSONArray;
  4. public class Main {
  5. public static void main(String[] args) {
  6. // JSON数组-多个json对象
  7. String jsonStr = "{\"array\":[{\"name\":\"张三\",\"sex\":\"男\"}," +
  8. "{\"name\":\"李四\",\"sex\":\"女\"}]}";
  9. // 将JSON字符串转换为JSON对象
  10. JSONObject jsonObj = JSON.parseObject(jsonStr);
  11. // 通过键名获取值
  12. JSONArray jsonArray = jsonArray.getJSONArray("array");
  13. for (int i = 0; i < jsonArray.size(); i++) {
  14. JSONObject json = JSON.parseObject(jsonArray.get(i).toString());
  15. String name = json.getString("name");
  16. String sex = json.getString("sex");
  17. System.out.println(name);
  18. System.out.println(sex);
  19. }
  20. }
  21. }

输出结果:

张三

李四


相关链接

JSON是什么?以及JSON结构的说明。

JSON(JavaScript Object Notation)-CSDN博客

序列化和反序列

序列化和反序列化-CSDN博客

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/882743
推荐阅读
相关标签
  

闽ICP备14008679号