fastjson泛型使用

在项目开发中遇到一些实体类字段不确定的情况,就需要使用泛型或者继承了。
例如情况:一个json串分为head和body两部分,body中存在List,就是说这个List包含的内容不是确定的,这时候就需要使用泛型了。

在使用泛型定义实体类的时候,要注意在实体类的无惨构造函数中进行实例化,否则会出错。

    private Data<T> data;
    public Root() {
        data = new Data<T>();
        System.out.println("root 实例化");
    }
    private List<T> list ;
    public Data() {
        list = new ArrayList<T>();
        System.out.println("Data 实例化");
    }

我在项目中使用的fastjson转化的,遇到的一个困难是从json串转化为泛型实体类的时候,转化异常。在网上找到的解决方法是

Root<PlatCameraResList> root = 
    JSON.parseObject(json, new TypeReference<Root<PlatCameraResList>>(){});

解释一下:
Root: 就是需要转化的结果实体类
PlatCameraResList:就是我上面代码中的不确定类型T
TypeReference:是fastjson中的实体类,具体什么作用还没有细看

经过上面的代码转化,就能够将json串转化为你指定的泛型结果。

测试代码:

        @Test
    public void test2() {
        IpcService service = new IpcServiceImpl();
        int flag;
        try {

//          flag = service.IpcSynchro();

            String json = FilesUtil.readFile("C:\\Users\\fsky\\Desktop\\json.txt");
//          root = JSON.parseObject(json,root.getClass()); //适用于一般的对象转换
            Root<PlatCameraResList> root = JSON.parseObject(json, new TypeReference<Root<PlatCameraResList>>(){});//适用于泛型转换
            List<PlatCameraResList> pcl = new ArrayList<PlatCameraResList>();
            pcl = root.getData().getList();
            System.out.println(pcl);
            int i = 1;
            for(PlatCameraResList pc : pcl) {
                System.out.println(i + " -- 编码设备ID:" + pc.getEncoderId() + " -- 编码设备全局唯一标识:" + pc.getEncoderSysCode() +
                        " --- 监控点名称:" + pc.getCameraName() + " --- 监控点全局唯一标识:" + pc.getSysCode() + " --- 监控点ID:" + pc.getCameraId());
                i++;
            }


//          String str = "https://www.baidu.com/";
            String response = PciUtil.sendGet(str, "java");
//          String response = PciUtil.sendPost(str);
//          System.out.println(response);
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

测试结果:

Data 实例化
root 实例化
Data 实例化
[com.anxin.bulkload.web.model.ipcmodel.PlatCameraResList@1180c894, com.anxin.bulkload.web.model.ipcmodel.PlatCameraResList@1df07586]
1 -- 编码设备ID:3 -- 编码设备全局唯一标识:8cb44716be4c4c349171c11c42e189d4 --- 监控点名称:HD-Screen Controller_监控点 1 --- 监控点全局唯一标识:0d28212313cf4e4d95a5c5990a8b2b14 --- 监控点ID:1
2 -- 编码设备ID:3 -- 编码设备全局唯一标识:8cb44716be4c4c349171c11c42e189d4 --- 监控点名称:HD-Screen Controller_监控点 2 --- 监控点全局唯一标识:8385328ce46644fe9ee83aec07612831 --- 监控点ID:2

总结:
1,泛型实体类在创建对象的时候一定要实例化(很重要)
2,json串转换为泛型实体类,不能使用

root = JSON.parseObject(json,root.getClass()); //适用于一般的对象转换

而要用到

Root<PlatCameraResList> root = 
    JSON.parseObject(json, new TypeReference<Root<PlatCameraResList>>(){});

参考:
fastjson泛型如何转换

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值