Fastjson

概述

Fastjson是一个高性能的Java JSON库,由阿里巴巴集团开发和维护。
Fastjson提供了一种简单而强大的方式来处理JSON数据,包括序列化、反序列化和操作JSON对象。它利用Java自带的反射机制来解析JSON字符串,可以将JSON字符串转换成Java对象,或者将Java对象转换成JSON字符串。
注意事项

  1. 安全性问题:尽管Fastjson在性能上表现出色,但在处理JSON数据时仍需要注意安全性问题。特别是其AutoType功能的安全性问题较为突出,因此在使用时需要谨慎。
  2. 版本更新:由于Fastjson是一个不断更新的库,因此建议定期查看其官方文档或更新日志,以了解最新的功能和修复的安全漏洞。
    综上所述,Fastjson是一个功能强大、性能卓越的Java JSON库。它提供了简单易用的API和丰富的功能特性,使得开发者能够高效地处理JSON数据。然而,在使用时也需要注意其安全性问题和版本更新情况。

主要特点

快速高效:Fastjson是目前Java中速度最快的JSON处理库之一,具有较快的序列化和反序列化速度。
简单易用:Fastjson提供了简单易用的API,使得使用者可以快速上手并进行JSON的处理。它支持复杂对象的处理,包括嵌套对象、集合、Map等,并且可以处理多种数据类型,包括基本数据类型、自定义对象等。
支持注解:Fastjson支持使用注解来指定Java对象与JSON字符串之间的映射关系,从而更加灵活地控制对象的转换。
自定义序列化和反序列化:Fastjson允许用户自定义实现对象的序列化和反序列化过程,可以通过实现Serializer和Deserializer接口来实现。
流式API:Fastjson提供了流式的API,可以在处理大量JSON数据时提供更好的性能。
广泛应用:Fastjson已经被广泛应用于各种Java项目中,包括大型的企业级应用和小型的个人项目。
应用场景

  1. 数据传输与存储:Fastjson可以将Java对象转换成JSON字符串进行数据传输和存储。这在前后端交互、跨系统数据传输等场景中非常常见。
  2. API开发与数据解析:Fastjson可以快速将JSON字符串解析为Java对象,方便在API开发中进行处理和操作。
  3. 对象序列化与反序列化:Fastjson提供了高效的对象序列化和反序列化功能,这对于分布式系统中的消息传递或者缓存存储等场景非常有用。

核心类和方法

JSON类:
toJSONString(Object object):将Java对象序列化为JSON字符串。
parseObject(String text):将JSON字符串解析为JSONObject。
parseObject(String text, Class clazz):将JSON字符串解析为指定类型的Java对象。
parseArray(String text):将JSON字符串解析为JSONArray。
parseArray(String text, Class clazz):将JSON字符串解析为指定类型的Java对象集合。

  1. JSONObject类:
    继承自JSON类,实现了Map接口,因此其底层操作是由Map实现的。它代表了一个JSON对象,其中的数据以键值对的形式出现。
  2. JSONArray类:
    同样继承自JSON类,代表了一个JSON对象数组。
    Fastjson API入口类是com.alibaba.fastjson.JSON,常用的序列化操作都可以在JSON类上的静态方法直接完成。
    public static final Object parse(String text); // 把JSON文本parse为JSONObject或者JSONArray
    public static final JSONObject parseObject(String text); // 把JSON文本parse成JSONObject
    public static final T parseObject(String text, Class clazz); // 把JSON文本parse为JavaBean
    public static final JSONArray parseArray(String text); // 把JSON文本parse成JSONArray
    public static final List parseArray(String text, Class clazz); //把JSON文本parse成JavaBean集合
    public static final String toJSONString(Object object); // 将JavaBean序列化为JSON文本
    public static final String toJSONString(Object object, boolean prettyFormat); // 将JavaBean序列化为带格式的JSON文本
    public static final Object toJSON(Object javaObject); 将JavaBean转换为JSONObject或者JSONArray。
    SerializeWriter:相当于StringBuffer
    JSONArray:相当于List
    JSONObject:相当于Map<String, Object>
    JSON反序列化没有真正数组,本质类型都是List
    fastjson还有很多很高级的特性,比如支持注解、支持全类型序列化,这些都是很好的特性,功能强大
    实体类或集合转JSON串
    String besnString = JSONObject.toJSONString(实体类);
    JSON串转JSONObject
    JSONObject jsonObject = JSONObject.parseObject(jsonString);
    JSON串转实体类
    体类 javaBean = JSON.parseObject(json, 实体类.class);
    JSON串转带泛型的List的集合
    List<实体类或其他泛型> list = JSON.parseObject(json, new TypeReference<List<实体类或其他泛型>>(){});
package jsonTest;
 
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
 
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.TypeReference;
 
 
public class MyJson {
	
	public static void main(String[] args) {
		
		List<Student> list=new ArrayList<>();
		Student student=new Student("bob",24);
		Student student12=new Student("lily", 23);
		list.add(student);
		list.add(student12);
		System.out.println("*******javaBean  to jsonString*******");
		String str1=JSON.toJSONString(student);
		System.out.println(str1);
		System.out.println(JSON.toJSONString(list));
		System.out.println();
		
		System.out.println("******jsonString to javaBean*******");
		//Student stu1=JSON.parseObject(str1,new TypeReference<Student>(){});
		Student stu1=JSON.parseObject(str1,Student.class);
		System.out.println(stu1);
		System.out.println();
		
		System.out.println("******javaBean to jsonObject******");
		JSONObject jsonObject1=(JSONObject)JSON.toJSON(student);
		System.out.println(jsonObject1.getString("name"));
		System.out.println();
		
		System.out.println("******jsonObject to javaBean******");
		Student student2=JSON.toJavaObject(jsonObject1, Student.class);
		System.out.println(student2);
		System.out.println();
		
		System.out.println("*******javaBean to jsonArray******");
		List<Student> stulist=new ArrayList<>();
		for(int i=0;i<5;i++){
			stulist.add(new Student("student"+i, i));
			
		}
		JSONArray jsonArrays=(JSONArray)JSON.toJSON(stulist);
		for(int i=0;i<jsonArrays.size();i++){
		System.out.println(jsonArrays.getJSONObject(i));
		}
		System.out.println();
		
		System.out.println("*****jsonArry to javalist******");
		List<Student> myList=new ArrayList<>();
		for(int i=0;i<jsonArrays.size();i++){
			
		Student student3=JSON.toJavaObject(jsonArrays.getJSONObject(i), Student.class);
			myList.add(student3);
		}
		for(Student stu:myList){
			System.out.println(stu);
		}
		
	        System.out.println();
		
		System.out.println("*****jsonObject to jsonString*****");
		String str4=JSON.toJSONString(jsonObject1);
		System.out.println(str4);
		System.out.println();
		
		System.out.println("*******jsonString to jsonObject*****");
		JSONObject jso1=JSON.parseObject(str1);
		System.out.println(jso1.getString("name"));
		System.out.println();
		
		System.out.println("*****jsonString to jsonArray*****");
		JSONArray jArray=JSON.parseArray(JSON.toJSONString(stulist));
		for(int i=0;i<jArray.size();i++){
		System.out.println(jArray.getJSONObject(i));
		}
		System.out.println();
	}
 
}

JSONObject

JSONObject jsonObject = new JSONObject();
jsonObject.put("TRADE_TYPE", "0110");
jsonObject.put("DECLARE_NUMBER", null);
jsonObject.put("COMPANY_NAME", null);
jsonObject.put("GOODS_TOTAL_AMOUNT", "4500.23000");
jsonObject.put("GOODS_TOTAL_WEIGHT", "1222.000");
jsonObject.put("PLATE_NUMBER", "浙B-12345");
jsonObject.put("IN_OUT_FLAG", "I");
jsonObject.put("YARD_IN_OUT_FLAG", "I");
jsonObject.put("DECLARE_TIME", null);
jsonObject.put("PASS_TIME", "2023-08-13 10:44:59");

JSONObject item = new JSONObject();
item.put("NAME", "尿不湿xx");
item.put("CODE", "3100002344");
item.put("WEIGHT", "1222.000");
item.put("AMOUNT", "4500.23000");

JSONObject item2 = new JSONObject();
item2.put("NAME", "哈哈");
item2.put("CODE", "3100002344");
item2.put("WEIGHT", "1222.000");
item2.put("AMOUNT", "4500.23000");
JSONArray itemsArray = new JSONArray();
itemsArray.add(item);
itemsArray.add(item2);
jsonObject.put("ITEMS", itemsArray);
rabbitmqService.sendObjectMessage(TRADE_DATA_TO_SHENGSHI,jsonObject);


  String jsonString = "{\"name\":\"John\",\"age\":30,\"city\":\"New York\"}";
        JSONObject jsonObject = JSONObject.parseObject(jsonString);

        // 获取字符串值
        String name = jsonObject.getString("name");
        if (name != null && !name.isEmpty()) {
            System.out.println("Name: " + name);
        }

        // 获取整数值
        Integer age = jsonObject.getInteger("age");
        if (age != null) {
            System.out.println("Age: " + age);
        }

        // 获取布尔值
        Boolean isStudent = jsonObject.getBoolean("isStudent");
        if (isStudent != null) {
            System.out.println("Is Student: " + isStudent);
        }

        // 判断某个字段是否存在
        if (jsonObject.containsKey("city")) {
            String city = jsonObject.getString("city");
            System.out.println("City: " + city);
        }
    }

Fastjson实体对象转换为 Map

public static Map<String, Object> object2Map(Object obj) {
//1.fastjson
 String objJSON = JSONObject.toJSONString(obj);
        if (null == objJSON) {
            log.warn("invalid obj");
            return null;
        }
        return JSONObject.parseObject(objJSON, new TypeReference<Map<String, Object>>() {});

Fastjson 是一个 Java 的 JSON 库,提供了丰富的功能来处理 JSON 数据。当使用 Fastjson 进行字符串到 Map 对象的转换时,它的底层原理如下:

  1. 解析:Fastjson 会先将 JSON 字符串解析成 JSON Token 流。JSON Token 是 Fastjson 内部定义的一种数据格式,它表示了 JSON 字符串中的各个元素,比如对象、数组、键值对等。
  2. 生成 Map 对象:在解析过程中,当 Fastjson 遇到 JSON 对象时,它会创建一个空的 Map 对象。然后,解析器会遍历 JSON 对象中的键值对,将键值对的键和值依次添加到这个 Map 对象中。
  3. 数据类型转换:Fastjson 会根据 JSON 中的值的类型,在 Map 对象中使用相应的 Java 对象来表示这些值。比如,JSON 中的数值将被转换为 Java 中的 Double、Long 等数值类型,字符串将被转换为 Java 中的 String 类型。
  4. 嵌套对象处理:如果 JSON 对象中存在嵌套的 JSON 对象或者数组,Fastjson 会递归地将其转换为对应的嵌套 Map 对象或者 List 对象,并将这些对象作为值添加到父级 Map 对象中。
    总结来说,Fastjson 的字符串到 Map 对象的转换原理是通过解析 JSON 字符串得到 JSON Token 流,然后根据解析过程中的规则,创建对应的 Map 对象,并将 JSON 中的键值对添加到 Map 中。
    在 Fastjson 中,将实体对象转换为 Map 对象时可能会比较慢的原因主要有以下几点:
  5. 反射开销:Fastjson 在实体对象转换为 Map 对象时,会使用反射机制来获取实体对象的属性信息并将其转换为键值对。反射操作通常比较耗时,特别是当实体对象的结构复杂或属性数量较多时,会增加反射操作的开销。
  6. 类型处理:在实体对象转换为 Map 对象时,Fastjson 需要处理各种数据类型的转换。这涉及到类型判断、类型转换以及相关的逻辑处理,这些操作可能会增加转换的时间成本。
  7. 嵌套对象处理:如果实体对象中存在嵌套的对象或集合,Fastjson 需要递归地进行转换操作,这可能导致转换时间的增加。尤其是当嵌套层级较深或者嵌套对象比较复杂时,转换速度可能会更慢。
  8. 特殊字段处理:有些实体对象中可能含有特殊字段,例如静态字段、transient 字段等,这些字段可能需要额外的处理逻辑来决定是否需要将其包含在 Map 对象中,这也可能导致转换时间的延长。
    为了提高性能,你可以尝试以下优化方法:
  9. 使用指定字段的转换:通过使用 Fastjson 提供的 @JSONField 注解,指定需要被转换的字段,避免不必要的字段转换操作。
  10. 简化实体对象结构:如果可能的话,尽量简化实体对象的结构,减少属性数量和嵌套层级,以降低转换的复杂度和耗时。
  11. 使用缓存:在多次转换同一个实体对象时,可以考虑将转换结果进行缓存,避免重复的转换操作。
  12. 考虑其他 JSON 库:如果性能要求较高,可以尝试其他 JSON 库,比如 Jackson、Gson 等,看是否能够满足你的需求。
    需要注意的是,并非所有情况下都能得到显著的性能提升,具体的优化策略需要根据实际情况进行评估和调整。

fastjson和fastjson2的区别

FastJSON是一种广泛使用的JSON解析库,其高性能和简单易用的特点受到开发者的喜爱。然而,随着应用场景的复杂化和安全要求的提高,FastJSON逐渐暴露出一些问题。为了解决这些问题并进一步提升性能和安全性,阿里巴巴推出了FastJSON2。以下是FastJSON和FastJSON2的详细对比:
一、性能
FastJSON:以其快速高效著称,可以快速地将Java对象转换为JSON字符串,也可以将JSON字符串转换为Java对象。
FastJSON2:在性能上进行了多方面的优化,通过优化序列化算法和数据结构,提高了序列化的效率,减少了不必要的对象创建和复制操作,从而降低了CPU和内存的开销。同时,对解析器进行了重构,使其能够更快速地处理大规模JSON数据。根据官方提供的性能测试数据,FastJSON2的性能远超其他流行的JSON库,如Jackson、Gson和org.json。
二、安全性
FastJSON:在安全性方面存在一些漏洞,特别是其AutoType功能的安全性问题较为突出。该功能在序列化的JSON字符串中带上类型信息,在反序列化时不需要传入类型,实现自动类型识别,但这也为恶意攻击提供了可能。
FastJSON2:在安全性方面做了显著改进,针对之前版本中暴露的一些安全漏洞进行了修复。为了防止反序列化漏洞,FastJSON2引入了更严格的黑名单机制,默认禁止了某些危险类型的反序列化操作。同时,增强了类型检测机制,可以更好地防止恶意数据的注入,确保数据解析的安全性。此外,FastJSON2的AutoType功能必须显式打开才能使用,且没有任何白名单,也不包括任何Exception类的白名单,这进一步提高了其安全性。
三、功能特性
FastJSON:支持复杂对象的处理,包括嵌套对象、集合、Map等;支持注解来指定Java对象与JSON字符串之间的映射关系;允许用户自定义实现对象的序列化和反序列化过程;提供了流式的API,可以在处理大量JSON数据时提供更好的性能。
FastJSON2:在FastJSON的基础上增加了一系列新的功能特性。例如,对JSONPath的支持更加全面和高效,允许开发者使用JSONPath表达式方便地访问和操作JSON数据;改进了对日期和时间的处理,提供了更多的配置选项和更好的性能,支持多种日期格式和时区处理;提供了对JSON Schema的支持,增强了数据验证的能力;新增加对二进制格式JSONB的支持,进一步提升了数据处理的效率和灵活性。
四、兼容性
FastJSON:作为早期版本的JSON处理库,已经被广泛应用于各种Java项目中。
FastJSON2:在保持与FastJSON兼容性的同时,也进行了一些必要的改进和优化。例如,FastJSON2支持最新的JDK特性,包括JDK 11和JDK 17等;同时提供了对Kotlin语言的优化支持,使得Kotlin开发者能够更加便捷地使用FastJSON2。此外,FastJSON2还支持跨平台兼容性,包括Android 8+等平台。
五、易用性
FastJSON:提供了简单明了的API,使用起来非常方便。
FastJSON2:对部分API进行了调整和优化,使其更加直观和易用。同时提供了更详细和友好的错误提示信息,帮助开发者更快地定位和解决问题。
综上所述,FastJSON2在性能、安全性、功能特性、兼容性和易用性等方面相比FastJSON都有显著的提升。对于需要高性能JSON解析和序列化的应用场景,特别是在安全性要求较高的情况下,FastJSON2是一个更好的选择。

### 使用方法 在FastJson中,对象与JSON的相互转换是基础操作。将对象转换为JSON可使用`JSON.toJSONString(obj)`方法,而将JSON转换为对象则使用`JSON.parseObject(jsonString, User.class)`方法。当JSON中包含Java对象没有的属性时,可通过创建反序列化特性`Feature[] features = {Feature.IgnoreNotMatch}`,并使用`JSON.parseObject(jsonString, User.class, features)`来进行反序列化操作 [^1][^3]。 ### 特性 FastJson具有一些显著特性。在性能方面,相较于Jackson和Gson,FastJson通常性能更高。其API更简单,使用起来较为便捷,并且功能丰富。不过,它也存在一些不足,例如缺乏像Jackson那样丰富的生态系统,设计的优雅程度和稳定性也不如Gson [^1]。 ### 常见问题解决方案 当JSON中包含Java对象没有的属性时,可通过创建反序列化特性并使用相应方法进行反序列化,避免出现异常。如创建`Feature[] features = {Feature.IgnoreNotMatch}`,再使用`JSON.parseObject(jsonString, User.class, features)`进行反序列化 [^1]。 ### 代码示例 ```java import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.parser.Feature; class User { private String name; private int age; // Getters and Setters public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } } public class FastJsonExample { public static void main(String[] args) { // 创建对象 User user = new User(); user.setName("John"); user.setAge(30); // 对象转JSON String jsonString = JSON.toJSONString(user); System.out.println("Object to JSON: " + jsonString); // JSON转对象 User parsedUser = JSON.parseObject(jsonString, User.class); System.out.println("JSON to Object - Name: " + parsedUser.getName() + ", Age: " + parsedUser.getAge()); // 处理JSON中包含Java对象没有的属性的情况 String jsonWithExtraAttr = "{\"name\":\"John\",\"age\":30,\"extra\":\"value\"}"; Feature[] features = {Feature.IgnoreNotMatch}; User userWithExtra = JSON.parseObject(jsonWithExtraAttr, User.class, features); System.out.println("JSON with extra attr to Object - Name: " + userWithExtra.getName() + ", Age: " + userWithExtra.getAge()); } } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

思静鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值