fastJson泛型如何转换

引子

  现在负责的业务 和 json 打交道比较多, 最近使用fastJson框架 json串转成泛型对象遇到了一个异常 :

java.lang.ClassCastException

还原下场景 :

模型Result<T>

public class Result<T> {

    private String msg;

    private List<T> module;

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public List<T> getModule() {
        return module;
    }

    public void setModule(List<T> module) {
        this.module = module;
    }

}

为什么要使用泛型, 可以理解泛型可以接受任意类型, 有些代码是公用的, 如结果集, 不可能为每个具体结果定义一个模型, 比如 Result<User>、Result<Item>等。

public class User {

    private Long user_id;

    private String user_name;

    public User() {

    }

    public User(Long userId, String name) {
        this.user_id = userId;
        this.user_name = name;
    }

    public Long getUser_id() {
        return user_id;
    }

    public void setUser_id(Long user_id) {
        this.user_id = user_id;
    }

    public String getUser_name() {
        return user_name;
    }

    public void setUser_name(String user_name) {
        this.user_name = user_name;
    }

}

下面直接看下泛型的转换

    public static void main(String[] args) {

        Result<User> r = new Result<User>();

        r.setMsg("msg");

        List<User> users = new ArrayList<>();
        users.add(new User(1L, "hehe"));
        users.add(new User(2L, "haha"));

        r.setModule(users);

        String js = JSON.toJSONString(r);

        System.out.println(js);

        Result<User> obj = (Result<User>)JSON.parseObject(js, Result.class);

        User user = obj.getModule().get(0);
        System.out.println(user);
    }

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco }
p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco; color: #ff2600 }
span.s1 { text-decoration: underline; color: #0433ff }
span.Apple-tab-span { white-space: pre }


结果 :

{"module":[{"user_id":1,"user_name":"hehe"},{"user_id":2,"user_name":"haha"}],"msg":"msg"}


Exception in thread "main" java.lang.ClassCastException: com.alibaba.fastjson.JSONObject cannot be cast to com.yuanmeng.json.User


at com.yuanmeng.json.fanxing.Client.main(Client.java:32)

 

采用fastjson框架的 TypeReference 即可将json串转成定义好的泛型对象

 
Result<User> obj = (Result<User>) JSON.parseObject(js, new TypeReference<Result<User>>(){});

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco; color: #0433ff }
span.s1 { text-decoration: underline }
span.s2 { color: #ff2600 }

时间: 2024-11-03 22:05:06

fastJson泛型如何转换的相关文章

List转DataTable(反射) ; 将泛型集合类转换成DataTable ; 将集合类转换成DataTable

#region 将集合类转换成DataTable /// <summary> /// 将集合类转换成DataTable /// </summary> /// <param name="list">集合</param> /// <returns></returns> public static DataTable ToDataTable(IList list) { DataTable result = new Dat

记 fastjson泛型转对象 第一次可以正常转,第二次就变成JSONArray 问题

在解析json数据的时候,在使用泛型对象的时候即: public class ResultMsgDto<E> implements Serializable { private static final long serialVersionUID = 123L; private int resultCode; private E resultObject; private String resultMsg; // get set } 第一次在使用 ResultMsgDto<List<

fastJson java后台转换json格式数据

什么事JSON? JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式. 易于人阅读和编写.同时也易于机器解析和生成. 它基于JavaScript Programming Language, Standard ECMA-262 3rd Edition - December 1999的一个子集. JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等

泛型 List转换成DataTable

1 private DataTable listToDataTable<T>(List<T> ListItem) 2 { 3 //实列化DataTable对象 4 var dt = new DataTable(typeof(T).Name); 5 6 //通过反射获取List实体的属性信息 7 PropertyInfo[] propertyInfos = typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Insta

DataSet和List&lt;T&gt; 泛型之间互相转换 (转载, 作者写的很好)

/DataSet与泛型集合间的互相转换 //利用反射机制将DataTable的字段与自定义类型的公开属性互相赋值. //注意:从DataSet到IList<T>的转换,自定义类型的公开属性必须与DataTable中的字段名称 //一致,才能到达想要的结果.建议DataTable的定义从数据库来,自定义类型用O/R Mapping的方式获得. //代码说明 /// <summary> /// 泛型集合与DataSet互相转换 /// </summary> using Sy

[转] 各种Json解析工具比较 - json-lib/Jackson/Gson/FastJson

JSON技术的调研报告 一 .各个JSON技术的简介和优劣1.json-libjson-lib最开始的也是应用最广泛的json解析工具,json-lib 不好的地方确实是依赖于很多第三方包,包括commons-beanutils.jar,commons-collections-3.2.jar,commons-lang-2.6.jar,commons-logging-1.1.1.jar,ezmorph-1.0.6.jar,对于复杂类型的转换,json-lib对于json转换成bean还有缺陷,比如

fastJson

(本文来自:http://www.cnblogs.com/zhenmingliu/archive/2011/12/29/2305775.html) 介绍fastjson之前先介绍常见的json解析工具: 1.json-libjson-lib最开始的也是应用最广泛的json解析工具,json-lib 不好的地方确实是依赖于很多第三方包,包括commons-beanutils.jar,commons-collections-3.2.jar,commons-lang-2.6.jar,commons-l

Gson和Fastjson的使用

转载自:JSON技术的调研报告 一.Google的Gson包的使用简单介绍. Gson类:解析json的最基础的工具类 JsonParser类:解析器来解析JSON到JsonElements的解析树 JsonElement类:一个类代表的JSON元素 JsonObject类:JSON对象类型 JsonArray类:JsonObject数组 TypeToken类:用于创建type,比方泛型List (1)maven依赖 com.google.code.gson gson 2.3.1 开源地址 ht

各个JSON技术的比较(Jackson,Gson,Fastjson)的对比

JSON技术的调研报告 一 .各个JSON技术的简介和优劣 1.json-lib json-lib最开始的也是应用最广泛的json解析工具,json-lib 不好的地方确实是依赖于很多第三方包, 包括commons-beanutils.jar,commons-collections-3.2.jar,commons-lang-2.6.jar,commons-logging-1.1.1.jar,ezmorph-1.0.6.jar, 对于复杂类型的转换,json-lib对于json转换成bean还有缺