zoukankan      html  css  js  c++  java
  • Fastjson和Gson零碎总结

    一:用于测试的类

    User类

    import lombok.Data;
    import lombok.experimental.Accessors;
    
    /**
     * @author silentdoer
     * @version 1.0
     */
    @Data
    @Accessors(chain = true)
    public class User {
        private String name;
        private String gender;
    }

    AppResult类

    import lombok.Data;
    import lombok.experimental.Accessors;
    
    /**
     * @author silentdoer
     * @version 1.0
     */
    @Data
    @Accessors(chain = true)
    public class AppResult<T> {
        private int code;
        private T data;
    }

    二:Fastjson测试代码

    String str = "{"code":100,"data":{"gender":"男","name":"中文"}}";
            AppResult<User> o = JSON.parseObject("{"code":100,"data":{"gender":"男","name":"中文"}}", AppResult.class);
            System.out.println(o);
            System.out.println(o.getData().getClass());  // flag

    在flag行会报java.lang.ClassCastException: com.alibaba.fastjson.JSONObject cannot be cast to User

    原因:因为Java的泛型擦除机制,无法像C#一样使用类似AppResult<User>.class,而AppResult.class中的T虽然在字节码里也叫T,但是会被jvm认为是Object的任意子类;

    结论:Fastjson检测到要转换的类型是泛型时将会把那部分JSON字符串转换为fastjson的JSONObject对象赋值给data,因此这里报转换错误

    三:Gson测试代码

    Gson gson = new Gson();
            AppResult<User> appResult = gson.fromJson(str, AppResult.class);
            System.out.println(appResult);
            System.out.println(appResult.getData().getClass());

    也是报异常:java.lang.ClassCastException: com.google.gson.internal.LinkedTreeMap cannot be cast to User

    结论:Gson如果检测到要反序列化的对象类型是泛型,那么将用一个gson自己的LinkedTreeMap来存储

    四:对于Jackson也是一样

    五:实现泛型的转换方式

    1.对于Fastjson或Gson都是可以有个TypeToken一样的东西,不过这里用个更简单的方法:

    Fastjson:

    AppResult<User> o = JSON.parseObject("{"code":100,"data":{"gender":"男","name":"中文"}}", new AppResult<User>(){}.getClass());

    Gson:Gson似乎不行,只能用TypeToken来实现;

    Fastjson可以的原理,其实就是因为泛型类虽然无法保留泛型的具体类型,但是其子类在具体化泛型后是可以保留的,因此new一个泛型类的空实现的子类,然后getClass()即可;

  • 相关阅读:
    利用表格分页显示数据的js组件datatable的使用
    css和javascript代码写在页面中的位置说明
    jqueryui组件progressbar进度条和日期组件datepickers的简单使用
    漏洞扫描工具Nessu的安装和简单使用
    jqueryui插件slider的简单使用
    html常用标签表单和表格等及css的简单入门
    通过flask实现web页面简单的增删改查bootstrap美化版
    jquery简单使用入门
    bootstrap简单使用布局、栅格系统、modal标签页等常用组件入门
    Centos7.3_x86_64通过systemctl控制tomcat8.0.46启动和停止
  • 原文地址:https://www.cnblogs.com/silentdoer/p/9095524.html
Copyright © 2011-2022 走看看