深度解析FastJson

一、FastJson概述

FastJson是一個Java語言編寫的高性能JSON解析器和生成器,由阿里巴巴公司開發和維護,已經成為了Java開發中廣泛使用的JSON解析工具之一。FastJson在解析JSON字元串時,具有解析速度快,易用性高,內存佔用低等優勢,同時還支持廣泛的Java數據類型轉換和泛型解析。

二、基本使用

FastJson支持從String、InputStream、Reader和Byte[]等多種數據源讀取JSON數據,並能夠將JSON數據轉化為Java對象或者JavaBean。 下面是一個基本的FastJson使用示例:

  
  public class User {
      private String name;
      private int age;
      // getter and setter
  }
  
  // 將Java對象轉換為JSON字元串
  User user = new User();
  user.setName("Tom");
  user.setAge(22);
  String jsonString = JSON.toJSONString(user);
  
  // 將JSON字元串轉換為Java對象
  User user2 = JSON.parseObject(jsonString, User.class);
  
  // 將JSON字元串轉換為JavaBean
  JSONObject jsonObject = JSON.parseObject(jsonString);
  User user3 = jsonObject.toJavaObject(User.class);
  

三、JSON序列化和反序列化

FastJson支持Java對象與JSON字元串之間的序列化和反序列化,即將Java對象轉化成JSON字元串,以及將JSON字元串轉為Java對象。

1. 序列化

序列化是指將Java對象轉化為JSON字元串。

(1) Java對象轉為JSON字元串

    User user = new User();  user.setName("Tom");  user.setAge(22);    // 將java對象轉換為json字元串  String jsonString = JSON.toJSONString(user);  

(2) 數組轉換為JSON字元串

    String[] strArray = {"a", "b", "c"};  // 將數組轉換為json數組字元串  String jsonArrayStr = JSONArray.toJSONString(strArray);  

(3) List轉換為JSON字元串

    List userList = new ArrayList();  User user1 = new User();  user1.setName("Tom");  user1.setAge(22);  userList.add(user1);  User user2 = new User();  user2.setName("John");  user2.setAge(33);  userList.add(user2);  // 將List轉換為json數組字元串  String jsonArrayStr = JSONArray.toJSONString(userList);  

2. 反序列化

反序列化是將JSON字元串轉為Java對象。

(1) JSON字元串轉Java對象

  
  String jsonString = "{\"name\":\"Tom\", \"age\":22}";
  // 將json字元串轉換為java對象
  User user = JSON.parseObject(jsonString, User.class);
  

(2) JSON字元串轉List

  
  String jsonArrayStr = "[{\"name\":\"Tom\", \"age\":22},{\"name\":\"John\", \"age\":33}]";
  // 將json數組字元串轉換為List
  List userList = JSONArray.parseArray(jsonArrayStr, User.class);
  

四、防止Java對象循環引用

FastJson支持防止Java對象循環引用,當Java對象中存在循環引用時,可以通過設置SerializerFeature.DisableCircularReferenceDetect禁用循環引用檢測。

  
  User userA = new User();
  User userB = new User();
  userA.setName("Tom");
  userA.setAge(22);
  userB.setName("John");
  userB.setAge(33);
  userA.setFriend(userB);
  userB.setFriend(userA);
  // 將java對象轉換為json字元串(禁用循環引用檢測)
  String jsonString = JSON.toJSONString(userA, SerializerFeature.DisableCircularReferenceDetect);
  

五、JavaBean序列化與反序列化

FastJson提供了將JavaBean對象直接序列化成JSON字元串以及將JSON字元串轉換為JavaBean對象的方法。

1. JavaBean轉換成JSON字元串

可以使用 JSON.toJSONString(Object obj) 方法將JavaBean轉換為JSON字元串。

  
  User user = new User();
  user.setName("Tom");
  user.setAge(22);
  // 將JavaBean對象轉換為JSON字元串
  String jsonString = JSON.toJSONString(user);
  

2. JSON字元串轉換成JavaBean

可以使用 JSON.parseObject(String text, Class clazz) 方法將JSON字元串轉換為JavaBean對象。

  
  String jsonString = "{\"name\":\"Tom\", \"age\":22}";
  // 將JSON字元串轉換為Java對象
  User user = JSON.parseObject(jsonString, User.class);
  

3. 嵌套的JavaBean對象

支持將嵌套的JavaBean對象直接轉換成JSON字元串,以及將JSON字元串轉換成嵌套的JavaBean對象。

  
  public class Group {
      private int groupId;
      private String groupName;
      private List userList;
      // getter and setter
  }
  
  User user1 = new User();
  user1.setName("Tom");
  user1.setAge(22);
  User user2 = new User();
  user2.setName("John");
  user2.setAge(33);
  List userList = new ArrayList();
  userList.add(user1);
  userList.add(user2);
  
  Group group = new Group();
  group.setGroupId(111);
  group.setGroupName("test group");
  group.setUserList(userList);
 
  // 將自定義JavaBean對象轉換為JSON字元串
  String jsonString = JSON.toJSONString(group);
 
  // 將JSON字元串轉換為自定義JavaBean對象
  Group group2 = JSON.parseObject(jsonString, Group.class);
  

六、JSON字元串格式化

FastJson提供了美化輸出的方法,便於調試和查看。

  
  User user = new User();
  user.setName("Tom");
  user.setAge(22);
  String jsonString = JSON.toJSONString(user, SerializerFeature.PrettyFormat);
  

七、FastJson性能優化

FastJson是一個高性能的JSON解析器,在解析JSON字元串時具有較高的運行速度和卓越的內存管理能力。下面列舉了幾個性能優化的方法:

1. 關閉對象到JSON字元串的轉換

當你的JavaBean不需要轉換成JSON字元串時,可以關閉該轉換以提高性能。

  
   User user = new User();
   user.setName("Tom");
   user.setAge(22);
  
  // 將Java對象轉換成JSON字元串(關閉JavaBean對json字元串的序列化)
  String jsonString = JSON.toJSONString(user, SerializerFeature.DisableCircularReferenceDetect);
  

2. 使用stream API處理大量JSON數據

FastJson提供了stream API來處理大量的JSON數據,以減少內存和提高性能。

  
  JSONReader reader = new JSONReader(new FileReader("data.json"));
  reader.startArray();
  while (reader.hasNext()) {
      User user = reader.readObject(User.class);
      // do something with user
  }
  reader.endArray();
  reader.close();
  

八、FastJson配置

FastJson提供了一些配置項,可以通過設置這些配置項來調整FastJson的行為。下面列舉了一些常見的配置項:

1. 更改日期格式

FastJson默認使用ISO-8601格式來序列化日期,可以通過設置SerializerFeature.WriteDateUseDateFormat配置項來更改日期格式。

  
  User user = new User();
  user.setName("Tom");
  user.setAge(22);
  user.setBirthDate(new Date());
  
  // 將Java對象轉換為JSON字元串(設置日期格式)
  String jsonString = JSON.toJSONStringWithDateFormat(user, "yyyy-MM-dd HH:mm:ss", SerializerFeature.WriteDateUseDateFormat);
  

2. 序列化Map時排序

默認情況下,FastJson不保證序列化Map時保持任何順序,可以通過設置SerializerFeature.MapSortField配置項來按照key進行排序。

  
  Map map = new LinkedHashMap();
  map.put("b", "valB");
  map.put("d", "valD");
  map.put("a", "valA");
  map.put("c", "valC");
  
  // 將Map轉換為json字元串(按key排序)
  String jsonString = JSON.toJSONString(map, SerializerFeature.MapSortField);
  

3. Enum序列化時使用名稱

默認情況下,FastJson將Java Enum類型序列化為數字,可以通過設置SerializerFeature.WriteEnumUsingName配置項將Enum類型序列化為名稱。

  
  public enum Gender {
      MALE, FEMALE
  }
  
  public class User {
      private String name;
      private Gender gender;
      // getter and setter
  }
  
  User user = new User();
  user.setName("Tom");
  user.setGender(Gender.MALE);
  
  // 將Java對象轉換為JSON字元串(使用枚舉名稱)
  String jsonString = JSON.toJSONString(user, SerializerFeature.WriteEnumUsingName);
  

九、FastJson異常處理

FastJson在解析JSON字元串時可能會拋出JsonFormatException等異常,可以通過try-catch語句來捕獲這些異常並進行處理。

  
  String jsonString = "{\"name\":\"Tom\", \"age\":22, \"birthDate\":\"2020-01-01\"}";
  try {
      User user = JSON.parseObject(jsonString, User.class);
  } catch (JSONException e) {
      // 處理異常
      System.out.println("JSON解析異常:" + e.getMessage());
  }
  

總結

FastJson是一個高性能的Java JSON解析器和生成器,具有解析速度快、易用性高、內存佔用低等優勢。本文主要對FastJson的使用進行了詳細的介紹,包括基本使用、JSON序列化與反序列化、防止Java對象循環引用、JavaBean序列化與反序列化、JSON字元串格式化、性能優化、配置和異常處理等方面。掌握了這些知識,可以更加高效地使用FastJson進行JSON數據處理。

原創文章,作者:VCJTY,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/369471.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
VCJTY的頭像VCJTY
上一篇 2025-04-13 11:45
下一篇 2025-04-13 11:45

相關推薦

  • 深度查詢宴會的文化起源

    深度查詢宴會,是指通過對一種文化或主題的深度挖掘和探究,為參與者提供一次全方位的、深度體驗式的文化品嘗和交流活動。本文將從多個方面探討深度查詢宴會的文化起源。 一、宴會文化的起源 …

    編程 2025-04-29
  • Python下載深度解析

    Python作為一種強大的編程語言,在各種應用場景中都得到了廣泛的應用。Python的安裝和下載是使用Python的第一步,對這個過程的深入了解和掌握能夠為使用Python提供更加…

    編程 2025-04-28
  • Python遞歸深度用法介紹

    Python中的遞歸函數是一個函數調用自身的過程。在進行遞歸調用時,程序需要為每個函數調用開闢一定的內存空間,這就是遞歸深度的概念。本文將從多個方面對Python遞歸深度進行詳細闡…

    編程 2025-04-27
  • Spring Boot本地類和Jar包類載入順序深度剖析

    本文將從多個方面對Spring Boot本地類和Jar包類載入順序做詳細的闡述,並給出相應的代碼示例。 一、類載入機制概述 在介紹Spring Boot本地類和Jar包類載入順序之…

    編程 2025-04-27
  • 深度解析Unity InjectFix

    Unity InjectFix是一個非常強大的工具,可以用於在Unity中修復各種類型的程序中的問題。 一、安裝和使用Unity InjectFix 您可以通過Unity Asse…

    編程 2025-04-27
  • 深度剖析:cmd pip不是內部或外部命令

    一、問題背景 使用Python開發時,我們經常需要使用pip安裝第三方庫來實現項目需求。然而,在執行pip install命令時,有時會遇到「pip不是內部或外部命令」的錯誤提示,…

    編程 2025-04-25
  • 動手學深度學習 PyTorch

    一、基本介紹 深度學習是對人工神經網路的發展與應用。在人工神經網路中,神經元通過接受輸入來生成輸出。深度學習通常使用很多層神經元來構建模型,這樣可以處理更加複雜的問題。PyTorc…

    編程 2025-04-25
  • 深度解析Ant Design中Table組件的使用

    一、Antd表格兼容 Antd是一個基於React的UI框架,Table組件是其重要的組成部分之一。該組件可在各種瀏覽器和設備上進行良好的兼容。同時,它還提供了多個版本的Antd框…

    編程 2025-04-25
  • 深度解析MySQL查看當前時間的用法

    MySQL是目前最流行的關係型資料庫管理系統之一,其提供了多種方法用於查看當前時間。在本篇文章中,我們將從多個方面來介紹MySQL查看當前時間的用法。 一、當前時間的獲取方法 My…

    編程 2025-04-24
  • 深度學習魚書的多個方面詳解

    一、基礎知識介紹 深度學習魚書是一本系統性的介紹深度學習的圖書,主要介紹深度學習的基礎知識和數學原理,並且通過相關的應用案例來幫助讀者理解深度學習的應用場景和方法。在了解深度學習之…

    編程 2025-04-24

發表回復

登錄後才能評論