您的位置:

深度解析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数据处理。