JSON字符串转泛型对象
以下问题只仅限于博主自身遇到,不代表绝对出现问题
相关类展示:
参数基类
public class BaseParams {
}
基类
public abstract class AbstractPush<Params extends BaseParams> {protected abstract void execute(Params params);public void push(String json){//todo 分fastjson和fastjson2说明}}
测试类
public class TestPush extends AbstractPush<TestParams>{@Overrideprotected void execute(TestParams params) {System.out.println("params = " + params);}
}
测试类的泛型参数
import lombok.Data;@Data
@Accessors(chain = true)
public class TestParams extends BaseParams{private String name;private String sex;private Integer age;
}
错误案例
不能如下案例这样使用,在FastJson
中,写法不报红;在FastJson2
中,写法报红
基类#push(String)
public void push(String json){Type type = ((ParameterizedType) this.getClass().getGenericSuperclass()).getActualTypeArguments()[0];Params params = JSONObject.parseObject(json, new TypeReference<Params>(type) {});this.execute(params);
}
入口类
public class TestFunction {public static void main(String[] args) {TestPush testPush = new TestPush();TestParams testParams = new TestParams();testParams.setName("张三").setSex("男").setAge(10);testPush.push(JSON.toJSONString(testParams));}
}
执行结果:
参考网上资料(文末有说明),改进版
使用FastJson
去按照以下案例处理,会在对象转JSON时(JSON.toJSONString
),转化结果为{}
;使用FastJson2
在不使用Feature
配置项也返回{}
。只有当配置了Feature
才会返回私有属性。
后续博主也无法复现,故在使用TypeReference
最好使用FastJson2
,且使用Feature
配置项来保证以外发生
转换类
(新增)
@Data
public class Convertor<Params extends BaseParams> {private Params params;}
基类#push(String)
public void push(String json){Type type = ((ParameterizedType) this.getClass().getGenericSuperclass()).getActualTypeArguments()[0];Convertor<Params> convertor = JSONObject.parseObject(json, new TypeReference<Convertor<Params>>(type) {},JSONReader.Feature.FieldBased);this.execute(convertor.getParams());
}JSONReader.Feature.FieldBased:基于字段反序列化,如果不配置,会默认基于public的field和getter方法序列化。配置后,会基于非static的field(包括private)做反序列化。在fieldbase配置下会更安全
入口类
public class TestFunction {public static void main(String[] args) {TestPush testPush = new TestPush();Convertor<TestParams> convertor = new Convertor<>();TestParams testParams = new TestParams();testParams.setName("张三").setSex("男").setAge(10);convertor.setParams(testParams);String s = JSON.toJSONString(convertor, JSONWriter.Feature.FieldBased);testPush.push(s);}
}
执行结果:
参考:
fastJSON,使用TypeReference处理复杂的泛型对象