天天看點

解析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());
        });