天天看点

解析fastjson转bean bean中嵌套带范型的list集合时候 . Gsonfastjson如何转Bean

fastjson如何转Bean

总结

JSON转bean  如果 bean中没有 嵌套带范型的list集合 则只需要一次解析  

                  不然需要多次解析 .       

                               不多次解析也不会报错。只是别人调用你的接口 用到你bean中的list集合 并取出里面的数据用的时候会报错

1.例如  如果一个json中 单纯的对应一个bean bean中不嵌套任何的list或map 等  

像这样
           
@Data
public class ReturnString {
    private String code;
    private String message;
    private String data;
}
           

可以直接用

ReturnString returnString = JSON.parseObject(s, ReturnString.class);
           

2.例如 一个json中 嵌套了 带有范型的list集合

@Data
public class ReturnData<T> {
    private String code;
    private String message;
    private List<T> data;
}
           

这时需要两次解析

String response = HttpClientUtil.getResponce(edjConfiguration.getListAllUrl() + "?channel=" + channel + "&sign=" + md51);
ReturnData<customerData> returnData = JSON.parseObject(response, ReturnData.class);//第一次解析
        List<customerData> data = JSON.parseArray(JSON.parseObject(response).getString("data"), customerData.class);
        returnData.setData(data);//第二次解析
           

如果只一次解析 则

List<customerData> data1 = returnData.getData();
        System.out.println("data1.get(0).getCustomerId() = " + data1.get(0).getCustomerId());
           

报错 取不出来

3.例如一个json中 嵌套了 list集合 明确的不带范型

@Data
public class DriverData {
    private String code;
    private String message;
    private DriverInfo data;
}
           

则 可以只用解析一次

String s = HttpClientUtil.getResponce(edaijiaConfiguration.getDriverInfoUrl() + lj.get(1) + "&sign=" + md51);
        DriverData driverData = JSON.parseObject(s, DriverData.class);
           

可以取出打印

DriverInfo data = driverData.getData();
        System.out.println("data.getDriverId() = " + data.getDriverId());
           

不会和上面带有范型的需要两次解析,一次解析报错.  

如果用Gson 

里面有范型 只用这样解析一次就行了

@Data
public class ReturnData<T> {
    private String code;
    private String message;
    private List<T> data;
}
           
Gson gson = new Gson();
        ReturnData<customerData> o = gson.fromJson(response, new TypeToken<ReturnData<customerData>>() {}.getType());
        List<customerData> data1 = o.getData();
        data1.forEach(t->{
            System.out.println(t.getCustomerName());
        });