javascript
gson json转map_Java 中几种常用 JSON 库性能比较
作 者:飛污熊
來 源:xncoding.com/2018/01/09/java/jsons.html
廣而告之:由于此訂閱號換了個皮膚,系統自動取消了讀者的公眾號置頂。導致用戶接受文章不及時。您可以打開訂閱號,選擇置頂(標星)公眾號,重磅干貨,第一時間送達!
本篇通過JMH來測試一下Java中幾種常見的JSON解析庫的性能。每次都在網上看到別人說什么某某庫性能是如何如何的好,碾壓其他的庫。但是百聞不如一見,只有自己親手測試過的才是最值得相信的。
JSON不管是在Web開發還是服務器開發中是相當常見的數據傳輸格式,一般情況我們對于JSON解析構造的性能并不需要過于關心,除非是在性能要求比較高的系統。
目前對于Java開源的JSON類庫有很多種,下面我們取4個常用的JSON庫進行性能測試對比, 同時根據測試結果分析如果根據實際應用場景選擇最合適的JSON庫。
這4個JSON類庫分別為:Gson,FastJson,Jackson,Json-lib。
簡單介紹
選擇一個合適的JSON庫要從多個方面進行考慮:
字符串解析成JSON性能
字符串解析成JavaBean性能
JavaBean構造JSON性能
集合構造JSON性能
易用性
先簡單介紹下四個類庫的身份背景。
Gson
項目地址:https://github.com/google/gson
Gson是目前功能最全的Json解析神器,Gson當初是為因應Google公司內部需求而由Google自行研發而來,但自從在2008年五月公開發布第一版后已被許多公司或用戶應用。Gson的應用主要為toJson與fromJson兩個轉換函數,無依賴,不需要例外額外的jar,能夠直接跑在JDK上。在使用這種對象轉換之前,需先創建好對象的類型以及其成員才能成功的將JSON字符串成功轉換成相對應的對象。類里面只要有get和set方法,Gson完全可以實現復雜類型的json到bean或bean到json的轉換,是JSON解析的神器。
FastJson
項目地址:https://github.com/alibaba/fastjson
Fastjson是一個Java語言編寫的高性能的JSON處理器,由阿里巴巴公司開發。無依賴,不需要例外額外的jar,能夠直接跑在JDK上。FastJson在復雜類型的Bean轉換Json上會出現一些問題,可能會出現引用的類型,導致Json轉換出錯,需要制定引用。FastJson采用獨創的算法,將parse的速度提升到極致,超過所有json庫。
Jackson
項目地址:https://github.com/FasterXML/jackson
Jackson是當前用的比較廣泛的,用來序列化和反序列化json的Java開源框架。Jackson社區相對比較活躍,更新速度也比較快, 從Github中的統計來看,Jackson是最流行的json解析器之一,Spring MVC的默認json解析器便是Jackson。
Jackson優點很多:
Jackson 所依賴的jar包較少,簡單易用。
與其他 Java 的 json 的框架 Gson 等相比,Jackson 解析大的 json 文件速度比較快。
Jackson 運行時占用內存比較低,性能比較好
Jackson 有靈活的 API,可以很容易進行擴展和定制。
目前最新版本是2.9.4,Jackson 的核心模塊由三部分組成:
jackson-core 核心包,提供基于”流模式”解析的相關 API,它包括 JsonPaser 和 JsonGenerator。Jackson 內部實現正是通過高性能的流模式 API 的 JsonGenerator 和 JsonParser 來生成和解析 json。
jackson-annotations 注解包,提供標準注解功能;
jackson-databind 數據綁定包,提供基于”對象綁定” 解析的相關 API( ObjectMapper )和”樹模型” 解析的相關 API(JsonNode);基于”對象綁定” 解析的 API 和”樹模型”解析的 API 依賴基于”流模式”解析的 API。
Json-lib
項目地址:http://json-lib.sourceforge.net/index.html
json-lib最開始的也是應用最廣泛的json解析工具,json-lib 不好的地方確實是依賴于很多第三方包,對于復雜類型的轉換,json-lib對于json轉換成bean還有缺陷, 比如一個類里面會出現另一個類的list或者map集合,json-lib從json到bean的轉換就會出現問題。json-lib在功能和性能上面都不能滿足現在互聯網化的需求。
編寫性能測試
接下來開始編寫這四個庫的性能測試代碼。
添加maven依賴
當然首先是添加四個庫的maven依賴,公平起見,我全部使用它們最新的版本:
net.sf.json-lib json-lib 2.4 jdk15 com.google.code.gson gson 2.8.2 com.alibaba fastjson 1.2.46 com.fasterxml.jackson.core jackson-databind 2.9.4 com.fasterxml.jackson.core jackson-annotations 2.9.4四個庫的工具類
FastJsonUtil.java
public class FastJsonUtil { public static String bean2Json(Object obj) { return JSON.toJSONString(obj); } public static T json2Bean(String jsonStr, Class objClass) { return JSON.parseObject(jsonStr, objClass); }}GsonUtil.java
public class GsonUtil { private static Gson gson = new GsonBuilder.create; public static String bean2Json(Object obj) { return gson.toJson(obj); } public static T json2Bean(String jsonStr, Class objClass) { return gson.fromJson(jsonStr, objClass); } public static String jsonFormatter(String uglyJsonStr) { Gson gson = new GsonBuilder.setPrettyPrinting.create; JsonParser jp = new JsonParser; JsonElement je = jp.parse(uglyJsonStr); return gson.toJson(je); }}JacksonUtil.java
public class JacksonUtil { private static ObjectMapper mapper = new ObjectMapper; public static String bean2Json(Object obj) { try { return mapper.writeValueAsString(obj); } catch (JsonProcessingException e) { e.printStackTrace; return ; } } public static T json2Bean(String jsonStr, Class objClass) { try { return mapper.readValue(jsonStr, objClass); } catch (IOException e) { e.printStackTrace; return ; } }}JsonLibUtil.java
public class JsonLibUtil { public static String bean2Json(Object obj) { JSONObject jsonObject = JSONObject.fromObject(obj); return jsonObject.toString; } @SuppressWarnings("unchecked") public static T json2Bean(String jsonStr, Class objClass) { return (T) JSONObject.toBean(JSONObject.fromObject(jsonStr), objClass); }}準備Model類
這里我寫一個簡單的Person類,同時屬性有Date、List、Map和自定義的類FullName,最大程度模擬真實場景。
public class Person { private String name; private FullName fullName; private int age; private Date birthday; private List hobbies; private Map clothes; private List friends; // getter/setter省略 @Override public String toString { StringBuilder str = new StringBuilder("Person [name=" + name + 創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的gson json转map_Java 中几种常用 JSON 库性能比较的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 合并排序的非递归实现(自底向上设计)
- 下一篇: gateway网关_SpringClou