fastjson2自定义反序列化(ObjectReader)包含不同类型的List

场景:前后端需要传一个很复杂的参数A,A包含一个List<Object>的列表对象L,L中的每一个成员都可能是不同的Type类型P,fastjson的parseObject()只能将列表L内成员都反序列化成JsonObject类型,因此需要重写fastjson反序列化方法。

github官方文档写的非常不清楚,本文主要结合场景做一个补充。

一、思路

因为A中列表包含多个Object,类型未知,所以需要在包含的所有对象P中都添加一个同类型对象type来记录P的类型, P中再另创建对象value来保存所需参数,总体结构如下图所示。
在这里插入图片描述
因此,在自定义反序列时,需要先读取type中存储的class值,通过该值即可得到P的类型。

二、 自定义类实现ObjectReader接口

代码如下,可以使用JSONObject.parseObject()来实现反序列化。

import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONArray;
import com.alibaba.fastjson2.JSONObject;
import com.alibaba.fastjson2.JSONReader;
import com.alibaba.fastjson2.reader.ObjectReader;

import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.Map;
// 实现接口
public class ParamReader implements ObjectReader {
	public static final ParamReader INSTANCE = new ParamReader();
	
	@Override
	public Object readObject(JSONReader jsonReader, Type fieldType, Object fieldName, long features) {
	if (jsonReader.nextIfNull()) {
	    return null;
	}
	// readObject方法:将json字符串转化成K-V形式
	Map<String, Object> objectMap = jsonReader.readObject();
	// 新建一个目标类A,作为返回的结果
    A a= new A();
    a.l= new ArrayList<>();
    // 读取objectMap中的各个参数并赋给a中
    // List<Object> 读取为JSONArray对象
    JSONArray parameters = (JSONArray) objectMap.get("l");
    for (int i = 0; i < parameters.size(); i ++) {
		Type type = JSONObject.parseObject(JSON.toJSONString(parameters.get(i)), Type.class);
		// 自定义函数getParamType,获取class类型
		Class<?> strClass = getParamType(type);
		// 得到strClass即可得到真正的P
		Object param = JSONObject.parseObject(JSON.toJSONString(parameters.get(i)), strClass);
		// 保存至a中
		a.l.add(param);
	}
    return a;

三、 自定义反序列化的使用

public class Test {
	static {
	    // 注册,这样在反序列化A时才能采用自定义策略
	    JSON.register(A.class, ParamReader.INSTANCE);
	}
	public static void main(String[] args) {
		// 得到JSON字符串 str
		String str = getJSON();
		// 此步即可得到反序列化的a
        A a = JSONObject.parseObject(str, A.class);
	}
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值