gson和fastjson将json对象转换成javabean简单对照

it馅儿包子      2022-02-11     318

关键词:

同事离职,项目后端部分的迭代和重构后面由我接手.

今天看项目代码时,发现项目使用了Gson,用于将json字符串转换成javaBean.

以前没使用过Gson,随即,简单入了个们,

想起fastjson也有将json字符串转换成javaBean的API,随即简单比较了下源码.

fastjson中的API如下:

    /**
     * @since 1.2.9
     */
    public <T> T toJavaObject(Class<T> clazz) {
        return TypeUtils.cast(this, clazz, ParserConfig.getGlobalInstance());
    }



    @SuppressWarnings({ "unchecked", "rawtypes" })
    public static <T> T cast(Object obj, Class<T> clazz, ParserConfig config) {
        if (obj == null) {
            return null;
        }

        if (clazz == null) {
            throw new IllegalArgumentException("clazz is null");
        }

        if (clazz == obj.getClass()) {
            return (T) obj;
        }

        if (obj instanceof Map) {
            if (clazz == Map.class) {
                return (T) obj;
            }

            Map map = (Map) obj;
            if (clazz == Object.class && !map.containsKey(JSON.DEFAULT_TYPE_KEY)) {
                return (T) obj;
            }

            return castToJavaBean((Map<String, Object>) obj, clazz, config);
        }

        if (clazz.isArray()) {
            if (obj instanceof Collection) {

                Collection collection = (Collection) obj;
                int index = 0;
                Object array = Array.newInstance(clazz.getComponentType(), collection.size());
                for (Object item : collection) {
                    Object value = cast(item, clazz.getComponentType(), config);
                    Array.set(array, index, value);
                    index++;
                }

                return (T) array;
            }

            if (clazz == byte[].class) {
                return (T) castToBytes(obj);
            }
        }

        if (clazz.isAssignableFrom(obj.getClass())) {
            return (T) obj;
        }

        if (clazz == boolean.class || clazz == Boolean.class) {
            return (T) castToBoolean(obj);
        }

        if (clazz == byte.class || clazz == Byte.class) {
            return (T) castToByte(obj);
        }

        // if (clazz == char.class || clazz == Character.class) {
        // return (T) castToCharacter(obj);
        // }

        if (clazz == short.class || clazz == Short.class) {
            return (T) castToShort(obj);
        }

        if (clazz == int.class || clazz == Integer.class) {
            return (T) castToInt(obj);
        }

        if (clazz == long.class || clazz == Long.class) {
            return (T) castToLong(obj);
        }

        if (clazz == float.class || clazz == Float.class) {
            return (T) castToFloat(obj);
        }

        if (clazz == double.class || clazz == Double.class) {
            return (T) castToDouble(obj);
        }

        if (clazz == String.class) {
            return (T) castToString(obj);
        }

        if (clazz == BigDecimal.class) {
            return (T) castToBigDecimal(obj);
        }

        if (clazz == BigInteger.class) {
            return (T) castToBigInteger(obj);
        }

        if (clazz == Date.class) {
            return (T) castToDate(obj);
        }

        if (clazz == java.sql.Date.class) {
            return (T) castToSqlDate(obj);
        }

        if (clazz == java.sql.Timestamp.class) {
            return (T) castToTimestamp(obj);
        }

        if (clazz.isEnum()) {
            return (T) castToEnum(obj, clazz, config);
        }

        if (Calendar.class.isAssignableFrom(clazz)) {
            Date date = castToDate(obj);
            Calendar calendar;
            if (clazz == Calendar.class) {
                calendar = Calendar.getInstance(JSON.defaultTimeZone, JSON.defaultLocale);
            } else {
                try {
                    calendar = (Calendar) clazz.newInstance();
                } catch (Exception e) {
                    throw new JSONException("can not cast to : " + clazz.getName(), e);
                }
            }
            calendar.setTime(date);
            return (T) calendar;
        }

        if (obj instanceof String) {
            String strVal = (String) obj;

            if (strVal.length() == 0 //
                || "null".equals(strVal) //
                || "NULL".equals(strVal)) {
                return null;
            }

            if (clazz == java.util.Currency.class) {
                return (T) java.util.Currency.getInstance(strVal);
            }
        }

        throw new JSONException("can not cast to : " + clazz.getName());
    }





    @SuppressWarnings({ "unchecked" })
    public static <T> T castToJavaBean(Map<String, Object> map, Class<T> clazz, ParserConfig config) {
        try {
            if (clazz == StackTraceElement.class) {
                String declaringClass = (String) map.get("className");
                String methodName = (String) map.get("methodName");
                String fileName = (String) map.get("fileName");
                int lineNumber;
                {
                    Number value = (Number) map.get("lineNumber");
                    if (value == null) {
                        lineNumber = 0;
                    } else {
                        lineNumber = value.intValue();
                    }
                }

                return (T) new StackTraceElement(declaringClass, methodName, fileName, lineNumber);
            }

            {
                Object iClassObject = map.get(JSON.DEFAULT_TYPE_KEY);
                if (iClassObject instanceof String) {
                    String className = (String) iClassObject;

                    Class<?> loadClazz = (Class<T>) loadClass(className);

                    if (loadClazz == null) {
                        throw new ClassNotFoundException(className + " not found");
                    }

                    if (!loadClazz.equals(clazz)) {
                        return (T) castToJavaBean(map, loadClazz, config);
                    }
                }
            }

            if (clazz.isInterface()) {
                JSONObject object;

                if (map instanceof JSONObject) {
                    object = (JSONObject) map;
                } else {
                    object = new JSONObject(map);
                }

                return (T) Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(),
                                                  new Class<?>[] { clazz }, object);
            }

            if (config == null) {
                config = ParserConfig.getGlobalInstance();
            }

            JavaBeanDeserializer javaBeanDeser = null;
            ObjectDeserializer deserizer = config.getDeserializer(clazz);
            if (deserizer instanceof JavaBeanDeserializer) {
                javaBeanDeser = (JavaBeanDeserializer) deserizer;
            }
            
            if (javaBeanDeser == null) {
                throw new JSONException("can not get javaBeanDeserializer");
            }
            
            return (T) javaBeanDeser.createInstance(map, config);
        } catch (Exception e) {
            throw new JSONException(e.getMessage(), e);
        }
    }

  简单捋了一遍,看到代码中标黄的部分代码,可知,是利用反射原理来获得javaBean的.

 

 

 

如下,为Gson的demo:

技术分享
 1 package cn.code.gson;
 2 
 3 import java.io.*;
 4 
 5 import java.util.Map;
 6 
 7 import com.google.gson.Gson;
 8 import com.google.gson.GsonBuilder;
 9 
10 import cn.code.entity.Person;
11 
12 /**
13  * Created by zq on 2017/6/16.
14  */
15 public class GsonTest {
16 
17     /**
18      * @param args  主函数形参
19      */
20     public static void main(String[] args) {
21         Gson gson = new GsonBuilder().create();
22 
23         gson.toJson("Hello", System.out);
24         gson.toJson("123", System.out);
25         System.out.println();
26 
27 //      try (Writer writer = new FileWriter("d:\gson.txt")) {
28 //          gson.toJson("Hello", writer);
29 //          gson.toJson("123", writer);
30 //      } catch (IOException e) {
31 //          e.printStackTrace();
32 //      }
33         FileInputStream fileInputStream = null;
34 
35         try {
36             fileInputStream = new FileInputStream("d:\gson.txt");
37         } catch (FileNotFoundException e) {
38             e.printStackTrace();
39         }
40 
41         Person person = getJavaBean(fileInputStream);
42 
43         System.out.println(person);
44     }
45 
46     /**
47      *
48      * @param fileInputStream 根据附件字节流 返回java类
49      * @return
50      */
51     public static Person getJavaBean(FileInputStream fileInputStream) {
52         Gson   gson   = new GsonBuilder().create();
53         Person person = null;
54 
55         try (Reader reader = new InputStreamReader(fileInputStream)) {
56             person = gson.fromJson(reader, Person.class);
57         } catch (FileNotFoundException e) {
58             e.printStackTrace();
59         } catch (IOException e) {
60             e.printStackTrace();
61         }
62 
63         return person;
64     }
65 }
66 
67 
68 //~ Formatted by Jindent --- http://www.jindent.com
View Code

 

gson、fastjson、jackson、json-lib对比总结

...较:在项目选型的时候可以使用Google的Gson和阿里巴巴的FastJson两种并行使用,如果只是功能要求,没有性能要求,可以使用google的Gson,如果有性能上面的要求可以使用Gson将bean转换json确保数据的正确,使用FastJson将Json转换Bean2.1... 查看详情

75json解析库---fastjson,gson

JSON的简介:JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。用于数据转换传输,通用于PHP,Java,C++,C#,Python等编程语言数据交换传输。易于人阅读和编写,同时也易于机器解析和生成。基本结构:对象、数组。Gson的简... 查看详情

gson和fastjson

...,不需要例外额外的jar,能够直接跑在JDK上。阿里巴巴的FastJson:无依赖,不需要例外额外的jar,能够直接跑在JDK上。FastJson在复杂类型的Bean转换Json上会出现一些问题,可能会出现引用的类型,导致Json转换出错,需要制定引用。... 查看详情

json转换工具类(基于google的gson和阿里的fastjson)

在项目之中我们经常会涉及到字符串和各种对象的转换,为此特地整理了一下常用的转换方法一、基于com.google.code.gson封装的json转换工具类 1.在pom.xml文件里面引入gson的依赖<dependency><groupId>com.google.code.gson</groupId>... 查看详情

java对象数据与json对象数据之间的相互转换(fastjson)(代码片段)

...2、Jackson【根据场景使用】3.3、Gson【根据场景使用】3.4、FastJson【根据场景使用】4、FastJson常用的JSON格式转换4.1、测试案例4.2、将JSON格式的字符串转换为json对象4.3、将JSON字符串或者JSON对象转成Java对象4.4、将Java对象转换成JSON... 查看详情

jsonobject和jsonarray转化string

...; return new Gson().toJson(bean);2.将Json字符串转换成对象:   Gsongson= new Gson();    Objectres=gson.fromJson(json,beanClass);3.将Json字符串转换成JsonObject对象: JsonObjectreturnData= new JsonParser().pa... 查看详情

java中如何把字符串转换成map

1、使用fastJson将String转map:Stringout;ObjectsuccesResponse=JSON.parse(out);  //先转换成ObjectMapmap=(Map)succesResponse;    //Object强转换为Map2、String转java对象fastjson应用string字符串转换成java对象或者对象数组代码如下参考技... 查看详情

gson和fastjson的使用

转载自:JSON技术的调研报告一、Google的Gson包的使用简单介绍。Gson类:解析json的最基础的工具类JsonParser类:解析器来解析JSON到JsonElements的解析树JsonElement类:一个类代表的JSON元素JsonObject类:JSON对象类型JsonArray类:JsonObject数组... 查看详情

gson使用

Gson提供了fromJson()方法来实现从Json相关对象到Java实体的方法。在日常应用中,我们一般都会碰到两种情况,转成单一实体对象和转换成对象列表或者其他结构。先来看第一种:比如json字符串为:[“name”:”name0”,”age”:0]Personp... 查看详情

gson解析json字符串(代码片段)

...一个json字符串解析成一个jsonObject对象因此我要把上面的fastjson转换成是gson,如下图:JsonObjectobject=newJsonParser().parse(result).getAsJsonObject();怎样从gson中取出键的值使用gson把json字符串转换成一个list集合List<Com 查看详情

gson解析json字符串(代码片段)

...一个json字符串解析成一个jsonObject对象因此我要把上面的fastjson转换成是gson,如下图:JsonObjectobject=newJsonParser().parse(result).getAsJsonObject();怎样从gson中取出键的值使用gson把json字符串转换成一个list集合List<Com 查看详情

如何使用 Gson 和 Retrofit 将类似的 Json 对象转换为 Json 数组

】如何使用Gson和Retrofit将类似的Json对象转换为Json数组【英文标题】:HowtoconvertsimilarJsonobjectstoJsonArrayswithGsonandRetrofit【发布时间】:2021-07-1102:58:48【问题描述】:假设我收到来自API的以下响应"success":true,"base":"EUR","date":"2021-04-16",... 查看详情

java怎么将对象转换成json字符串

  可以使用jackson的newObjectMapper().readValue(String,bean.class);或者使用JSONObject.toBean(String,bean.class);都可以实现json转化为bean而jackson或者JSONObject的jar包网上均有下载,把下载的jar导入你的项目中即可。参考技术AGsongson=newGson();Stringjson=... 查看详情

让复杂json数据和对象自由转换---gson

...方便的功能,最常用的就是fromJson():将json数据转化为对象;toJson():将对象转化为json数据!对于普通的json数据使用这两个方法简直soeasy,但是对于稍有点复杂的json数据如何操作呢?比如json数据中除了json对象外,还有json... 查看详情

java中json对象转为string类型

...型JSON.parseObject(JSON.toJSONString(parseObject),String.class)json包是fastjson,需要先下载 参考技术C你的json是自定义类型吧?想输出对象时输出自己想要的对象属性字符串是吧?如果是就去json对象的类中覆写tostring()方法 查看详情

如何使用 GSON 将 List 转换为 JSON 对象?

】如何使用GSON将List转换为JSON对象?【英文标题】:HowtoconvertListtoaJSONObjectusingGSON?【发布时间】:2015-03-0917:00:52【问题描述】:我有一个需要使用GSON将其转换为JSON对象的列表。我的JSON对象中有JSON数组。publicclassDataResponseprivateLi... 查看详情

GSON。如何将json对象转换为json数组?

】GSON。如何将json对象转换为json数组?【英文标题】:GSON.Howtoconvertjsonobjecttojsonarray?【发布时间】:2016-05-0703:13:34【问题描述】:现在我从API获取这个JSON:"supplyPrice":"CAD":78,"CHF":54600.78,"USD":20735.52但价格是动态的,这就是我需要... 查看详情

将 JSON 字符串转换为 Gson 对象

】将JSON字符串转换为Gson对象【英文标题】:ConvertinganJSONstringtoGsonobject【发布时间】:2021-10-0412:48:06【问题描述】:我有一个JSONObject,它以以下方式创建。出于特殊原因,我必须以这种方式将其转换为Gson,因为我只能修改extract... 查看详情