1. 程式人生 > >各個JSON技術的比較

各個JSON技術的比較

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還有缺陷,比如一個類裡面會出現另一個類的list或者map集合,json-lib從json到bean的轉換就會出現問題。
json-lib在功能和效能上面都不能滿足現在網際網路化的需求。
2.開源的Jackson
相比json-lib框架,Jackson所依賴的jar包較少,簡單易用並且效能也要相對高些。
而且Jackson社群相對比較活躍,更新速度也比較快。
Jackson對於複雜型別的json轉換bean會出現問題,一些集合Map,List的轉換出現問題。
Jackson對於複雜型別的bean轉換Json,轉換的json格式不是標準的Json格式
3.Google的Gson
Gson是目前功能最全的Json解析神器,Gson當初是為因應Google公司內部需求而由Google自行研發而來,
但自從在2008年五月公開發布第一版後已被許多公司或使用者應用。
Gson的應用主要為toJson與fromJson兩個轉換函式,無依賴,不需要例外額外的jar,能夠直接跑在JDK上。
而在使用這種物件轉換之前需先建立好物件的型別以及其成員才能成功的將JSON字串成功轉換成相對應的物件。
類裡面只要有get和set方法,Gson完全可以將複雜型別的json到bean或bean到json的轉換,是JSON解析的神器。
Gson在功能上面無可挑剔,但是效能上面比FastJson有所差距。
4.阿里巴巴的FastJson
Fastjson是一個Java語言編寫的高效能的JSON處理器,由阿里巴巴公司開發。
無依賴,不需要例外額外的jar,能夠直接跑在JDK上。
FastJson在複雜型別的Bean轉換Json上會出現一些問題,可能會出現引用的型別,導致Json轉換出錯,需要制定引用。
FastJson採用獨創的演算法,將parse的速度提升到極致,超過所有json庫。

綜上4種Json技術的比較,在專案選型的時候可以使用Google的Gson和阿里巴巴的FastJson兩種並行使用,
如果只是功能要求,沒有效能要求,可以使用google的Gson,
如果有效能上面的要求可以使用Gson將bean轉換json確保資料的正確,使用FastJson將Json轉換Bean
二、Google的Gson包的使用簡介。
Gson類:解析json的最基礎的工具類
JsonParser類:解析器來解析JSON到JsonElements的解析樹
JsonElement類:一個類代表的JSON元素
JsonObject類:JSON物件型別
JsonArray類:JsonObject陣列
TypeToken類:用於建立type,比如泛型List<?>
(1)maven依賴

com.google.code.gson
gson
2.2.4

(2)基礎轉換類
public class Book{
private String id;
private String name;
public Book() {
super();
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public class Student{
private String name;
private int age;
private String sex;
private String describe;
private Set books;
public Student() {
super();
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public Set getBooks() {
return books;
}
public void setBooks(Set books) {
this.books = books;
}
public String getDescribe() {
return describe;
}
public void setDescribe(String describe) {
this.describe = describe;
}
}
(3)bean轉換json
Gson gson = new Gson();
String json = gson.toJson(obj);
obj是物件
(4)json轉換bean
Gson gson = new Gson();
String json = "{\"id\":\"2\",\"name\":\"Json技術\"}";
Book book = gson.fromJson(json, Book.class);
(5)json轉換複雜的bean,比如List,Set
將json轉換成複雜型別的bean,需要使用TypeToken
Gson gson = new Gson();
String json = "[{\"id\":\"1\",\"name\":\"Json技術\"},{\"id\":\"2\",\"name\":\"java技術\"}]";
//將json轉換成List
List list = gson.fromJson(json,new TypeToken<LIST>() {}.getType());
//將json轉換成Set
Set set = gson.fromJson(json,new TypeToken<SET>() {}.getType());
(6)通過json物件直接操作json以及一些json的工具
a)格式化Json
String json = "[{\"id\":\"1\",\"name\":\"Json技術\"},{\"id\":\"2\",\"name\":\"java技術\"}]";
Gson gson = new GsonBuilder().setPrettyPrinting().create();
JsonParser jp = new JsonParser();
JsonElement je = jp.parse(json);
json = gson.toJson(je);
b)判斷字串是否是json,通過捕捉的異常來判斷是否是json
String json = "[{\"id\":\"1\",\"name\":\"Json技術\"},{\"id\":\"2\",\"name\":\"java技術\"}]";
boolean jsonFlag;
try {
new JsonParser().parse(str).getAsJsonObject();
jsonFlag = true;
} catch (Exception e) {
jsonFlag = false;
}
c)從json串中獲取屬性
String json = "{\"id\":\"1\",\"name\":\"Json技術\"}";
String propertyName = 'id';
String propertyValue = "";
try {
JsonParser jsonParser = new JsonParser();
JsonElement element = jsonParser.parse(json);
JsonObject jsonObj = element.getAsJsonObject();
propertyValue = jsonObj.get(propertyName).toString();
} catch (Exception e) {
propertyValue = null;
}
d)除去json中的某個屬性
String json = "{\"id\":\"1\",\"name\":\"Json技術\"}";
String propertyName = 'id';
JsonParser jsonParser = new JsonParser();
JsonElement element = jsonParser.parse(json);
JsonObject jsonObj = element.getAsJsonObject();
jsonObj.remove(propertyName);
json = jsonObj.toString();
e)向json中新增屬性
String json = "{\"id\":\"1\",\"name\":\"Json技術\"}";
String propertyName = 'desc';
Object propertyValue = "json各種技術的調研";
JsonParser jsonParser = new JsonParser();
JsonElement element = jsonParser.parse(json);
JsonObject jsonObj = element.getAsJsonObject();
jsonObj.addProperty(propertyName, new Gson().toJson(propertyValue));
json = jsonObj.toString();
f)修改json中的屬性
String json = "{\"id\":\"1\",\"name\":\"Json技術\"}";
String propertyName = 'name';
Object propertyValue = "json各種技術的調研";
JsonParser jsonParser = new JsonParser();
JsonElement element = jsonParser.parse(json);
JsonObject jsonObj = element.getAsJsonObject();
jsonObj.remove(propertyName);
jsonObj.addProperty(propertyName, new Gson().toJson(propertyValue));
json = jsonObj.toString();
g)判斷json中是否有屬性
String json = "{\"id\":\"1\",\"name\":\"Json技術\"}";
String propertyName = 'name';
boolean isContains = false ;
JsonParser jsonParser = new JsonParser();
JsonElement element = jsonParser.parse(json);
JsonObject jsonObj = element.getAsJsonObject();
isContains = jsonObj.has(propertyName);
h)json中日期格式的處理
GsonBuilder builder = new GsonBuilder();
builder.setDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
Gson gson = builder.create();
然後使用gson物件進行json的處理,如果出現日期Date類的物件,就會按照設定的格式進行處理
i)json中對於Html的轉義
Gson gson = new Gson();
這種物件預設對Html進行轉義,如果不想轉義使用下面的方法
GsonBuilder builder = new GsonBuilder();
builder.disableHtmlEscaping();
Gson gson = builder.create();
三、阿里巴巴的FastJson包的使用簡介。
(1)maven依賴

com.alibaba
fastjson
1.1.22

(2)基礎轉換類
同上
(3)bean轉換json
將物件轉換成格式化的json
JSON.toJSONString(obj,true);
將物件轉換成非格式化的json
JSON.toJSONString(obj,false);
obj設計物件
對於複雜型別的轉換,對於重複的引用在轉成json串後在json串中出現引用的字元,比如 $ref":"$[0].books[1]
Student stu = new Student();
Set books= new HashSet();
Book book = new Book();
books.add(book);
stu.setBooks(books);
List list = new ArrayList();
for(int i=0;i<5;i++)
list.add(stu);
String json = JSON.toJSONString(list,true);
(4)json轉換bean
String json = "{\"id\":\"2\",\"name\":\"Json技術\"}";
Book book = JSON.parseObject(json, Book.class);
(5)json轉換複雜的bean,比如List,Map
String json = "[{\"id\":\"1\",\"name\":\"Json技術\"},{\"id\":\"2\",\"name\":\"java技術\"}]";
//將json轉換成List
List list = JSON.parseObject(json,new TypeReference<ARRAYLIST>(){});
//將json轉換成Set
Set set = JSON.parseObject(json,new TypeReference<HASHSET>(){});
(6)通過json物件直接操作json
a)從json串中獲取屬性
String propertyName = 'id';
String propertyValue = "";
String json = "{\"id\":\"1\",\"name\":\"Json技術\"}";
JSONObject obj = JSON.parseObject(json);
propertyValue = obj.get(propertyName));
b)除去json中的某個屬性
String propertyName = 'id';
String propertyValue = "";
String json = "{\"id\":\"1\",\"name\":\"Json技術\"}";
JSONObject obj = JSON.parseObject(json);
Set set = obj.keySet();
propertyValue = set.remove(propertyName);
json = obj.toString();
c)向json中新增屬性
String propertyName = 'desc';
Object propertyValue = "json的玩意兒";
String json = "{\"id\":\"1\",\"name\":\"Json技術\"}";
JSONObject obj = JSON.parseObject(json);
obj.put(propertyName, JSON.toJSONString(propertyValue));
json = obj.toString();
d)修改json中的屬性
String propertyName = 'name';
Object propertyValue = "json的玩意兒";
String json = "{\"id\":\"1\",\"name\":\"Json技術\"}";
JSONObject obj = JSON.parseObject(json);
Set set = obj.keySet();
if(set.contains(propertyName))
obj.put(propertyName, JSON.toJSONString(propertyValue));
json = obj.toString();
e)判斷json中是否有屬性
String propertyName = 'name';
boolean isContain = false;
String json = "{\"id\":\"1\",\"name\":\"Json技術\"}";
JSONObject obj = JSON.parseObject(json);
Set set = obj.keySet();
isContain = set.contains(propertyName);
f)json中日期格式的處理
Object obj = new Date();
String json = JSON.toJSONStringWithDateFormat(obj, "yyyy-MM-dd HH:mm:ss.SSS");
使用JSON.toJSONStringWithDateFormat,該方法可以使用設定的日期格式對日期進行轉換

三、json-lib包的使用簡介。
(1)maven依賴

net.sf.json-lib
json-lib
jdk15
2.2.2


commons-beanutils
commons-beanutils
1.8.3


commons-collections
commons-collections
3.2


commons-lang
commons-lang
2.6


commons-logging
commons-logging
1.1.1


net.sf.ezmorph
ezmorph
1.0.6

(2)基礎轉換類
同上
(3)bean轉換json
a)將類轉換成Json,obj是普通的物件,不是List,Map的物件
String json = JSONObject.fromObject(obj).toString();
b)將List,Map轉換成Json
String json = JSONArray.fromObject(list).toString();
String json = JSONArray.fromObject(map).toString();
(4)json轉換bean
String json = "{\"id\":\"1\",\"name\":\"Json技術\"}";
JSONObject jsonObj = JSONObject.fromObject(json);
Book book = (Book)JSONObject.toBean(jsonObj,Book.class);
(5)json轉換List,對於複雜型別的轉換會出現問題
String json = "[{\"id\":\"1\",\"name\":\"Json技術\"},{\"id\":\"2\",\"name\":\"Java技術\"}]";
JSONArray jsonArray = JSONArray.fromObject(json);
JSONObject jsonObject;
T bean;
int size = jsonArray.size();
List list = new ArrayList(size);
for (int i = 0; i < size; i++) {
jsonObject = jsonArray.getJSONObject(i);
bean = (T) JSONObject.toBean(jsonObject, beanClass);
list.add(bean);
}
(6)json轉換Map
String jsonString = "{\"id\":\"1\",\"name\":\"Json技術\"}";
JSONObject jsonObject = JSONObject.fromObject(jsonString);
Iterator keyIter = jsonObject.keys();
String key;
Object value;
Map valueMap = new HashMap();
while (keyIter.hasNext()) {
key = (String) keyIter.next();
value = jsonObject.get(key).toString();
valueMap.put(key, value);
}
(7)json對於日期的操作比較複雜,需要使用JsonConfig,比Gson和FastJson要麻煩多了
建立轉換的介面實現類,轉換成指定格式的日期
class DateJsonValueProcessor implements JsonValueProcessor{
public static final String DEFAULT_DATE_PATTERN = "yyyy-MM-dd HH:mm:ss.SSS";
private DateFormat dateFormat;
public DateJsonValueProcessor(String datePattern) {
try {
dateFormat = new SimpleDateFormat(datePattern);
} catch (Exception ex) {
dateFormat = new SimpleDateFormat(DEFAULT_DATE_PATTERN);
}
}
public Object processArrayValue(Object value, JsonConfig jsonConfig) {
return process(value);
}
public Object processObjectValue(String key, Object value,
JsonConfig jsonConfig) {
return process(value);
}
private Object process(Object value) {
return dateFormat.format[

1];
Map<STRING,DATE> birthDays = new HashMap<STRING,DATE>();
birthDays.put("WolfKing",new Date());
JSONObject jsonObject = JSONObject.fromObject(birthDays, jsonConfig);
String json = jsonObject.toString();
System.out.println(json);
}
}
(8)JsonObject 對於json的操作和處理
a)從json串中獲取屬性
String jsonString = "{\"id\":\"1\",\"name\":\"Json技術\"}";
Object key = "name";
Object value = null;
JSONObject jsonObject = JSONObject.fromObject(jsonString);
value = jsonObject.get(key);
jsonString = jsonObject.toString();
b)除去json中的某個屬性
String jsonString = "{\"id\":\"1\",\"name\":\"Json技術\"}";
Object key = "name";
Object value = null;
JSONObject jsonObject = JSONObject.fromObject(jsonString);
value = jsonObject.remove(key);
jsonString = jsonObject.toString();
c)向json中新增和修改屬性,有則修改,無則新增
String jsonString = "{\"id\":\"1\",\"name\":\"Json技術\"}";
Object key = "desc";
Object value = "json的好東西";
JSONObject jsonObject = JSONObject.fromObject(jsonString);
jsonObject.put(key,value);
jsonString = jsonObject.toString();
d)判斷json中是否有屬性
String jsonString = "{\"id\":\"1\",\"name\":\"Json技術\"}";
boolean containFlag = false;
Object key = "desc";
JSONObject jsonObject = JSONObject.fromObject(jsonString);
containFlag = jsonObject.containsKey(key);

相關推薦

各個JSON技術比較(Jackson,Gson,Fastjson)的對比

一 、各個JSON技術的簡介和優劣 1.json-lib json-lib最開始的也是應用最廣泛的json解析工具,json-lib 不好的地方確實是依賴於很多第三方包, 包括commons-beanutils.jar,commons-collections-3

各個JSON技術比較

JSON技術的調研報告一 、各個JSON技術的簡介和優劣1.json-libjson-lib最開始的也是應用最廣泛的json解析工具,json-lib 不好的地方確實是依賴於很多第三方包,包括commons-beanutils.jar,commons-collections-3.2.jar,commons-l

各個JSON技術的簡介和優劣

pan ns-3 json轉換 出錯 如果 算法 spa 出現問題 項目 各個JSON技術的簡介和優劣 (這裏只介紹各自優點和缺點,具體用法,請大家到網上去查找) 特別是fastJaso用法。這裏介紹的不錯: https://www.cnblog

谷歌JSON技術--轉換成JSON忽略某些屬性

con ioe mat ring artifact noj arr except rri 公司小項目剛開始。自己編寫了一些Util方法 本公司用谷歌的json技術來處理json,通過接收HttpServletRequest 的輸入流來轉化成實體 pom.xml 如下 &

更新html技術比較

訪問 很難 推薦 字符 事件處理 strong 生效 每一個 doc document.write() document對象的write方法可以很簡單的向頁面的源代碼中添加內容,不過不推薦使用。 優點:可以快速簡單的讓初學者理解如何向頁面添加內容; 缺點: 只有

產品經理如何與強勢的技術溝通? 技術比較有資歷,會以技術無法實現等方面的原因拒絕處理產品提出的需求。 你們是否遇到這樣的技術? 產品懂技術的話,是不是會好一些,因為可以和技術說“行話”了,並且產品懂技術就不會被忽悠了。

intern 世界 自己人 做好自己 最重要的 叠代開發 對比 不一定 制造 PM在YY...作為強勢的技術來回答一下吧。說明白WHY,HOW,WHAT就好了。 我想點兩個贊,u can u up,no can no bb 什麽的。 微軟的win8之父年輕時候也是一個PM應

裸光纖與恒通未來DWDM技術比較

裸光纖 dwdm 密集波分復用器 dwdm技術 10g 40g 城域網 恒通未來裸光纖與恒通未來DWDM技術比較,城域網裸光纖承載與恒通未來DWDM承載的相關技術比較1.1 裸光纖/恒通未來DWDM的技術比較 1.2 裸光纖/恒通未來DWDM的經濟比較建

Openvz/KVM/Xen三種常見VPS虛擬化技術比較

更多 創建 半虛擬化 war 說明 文件 body 折騰 動態 mjj 剁機器時一般都會關心下超售情況,這裏簡要說明下各虛擬化技術超售能力。 KVM 不可超售資源:內存,硬盤空間 內存:KVM 在分配內存時是完全獨占的,也就是說母雞不能生出內存大於總物理內存的小雞。硬盤:

SAP S4CRM和C4C的技術比較

一點 ren strip 號稱 bsp 人在 ash 分配 down 如果您對SAP S/4HANA for Customer Management(以下簡稱S4CRM)和SAP Cloud for Customer(以下簡稱C4C)不甚熟悉,那我建議您可以先瀏覽我之前寫的

三種虛擬化技術比較

設備 conf build lin 不能 MF lsp 重復 進行 三種虛擬化技術比較 ESXi 與其它虛擬化底層產品之比較: 序號 虛擬化管理程序屬性 VMware ESXi 5.0 采用 Hyper-V 的 Windows Server 20

protobuf json xml比較

TP bsp 第一個 col 一個 CA protocol PE 快的 1 protobuf/xml/json對比 從數據的存儲格式的角度進行對比 假如要存儲一個鍵值對: {price:150} 1.1 protobuf的表示方式 message Test { o

五個主流乙太網技術比較

2016年06月22日 14:36:54 leonliufeng 閱讀數:10020 前言 對於局外人而言,工業乙太網的存在很多讓他們混淆的問題-而且並非孤立,即使那些專家有時候也被各種風起雲湧的競爭系統所困擾,儘管製造商們提供了很多資訊,描述他們的技術性能和特定的功能,

XenServer和VMware vSphere技術比較

         此次將Citrix XenServer7.1和VMware ESXi 6.5從技術角度進行比較,並從企業角度對企業關心的項進行比較。主要包含市場地位、伺服器虛擬化底層穩定性、管理架構、相容性上進行分析。

XML 和 json 解析比較

1. 定義 XML,即 extensible Markup Language ,是一種資料標記語言 & 傳輸格式 2. 作用 對資料進行標記(結構化資料)、儲存 & 傳輸 區別於 html :html用於顯示資訊;而 XML用於儲存&傳輸資訊

常用動畫實現技術比較--animate/animation/transition

在工作中,經常需要用不同的技術實現動畫。於是,想總結一下這三種實現方式的異同,以便以後面對不同的動畫需求,可以快速選擇出適合的動畫技術。因為是菜鳥,如果有總結不對或不到位的地方,請大神不吝賜教。 animate是jquery中的一個函式,an

JSON字串對比,JSON陣列比較

這幾天做公司專案,儲存欄位的時候,變更前,變更後,哪些欄位變更了,都變更了什麼內容 這裡 我用json字串 對比  然後拼接成json,插入記錄表的...................... 不好

PostgreSQL的叢集技術比較

PostgreSQL 資料庫的可用叢集技術如下:1、Bucardo    複製技術,主從複製,非同步,基於 觸發器。      詳情: https://wiki.postgresql.org/wiki/Bucardo 2、GridSQL   一個開源的,我共享的叢集資料庫系統,可用於PostgreSQL資料倉

OSI中各層次的VPN技術比較

1 引言     隨著網路技術和網路應用的迅猛發展,使用者對專用網路的需求越來越大,遠端辦公室、公司各分支機構、公司與合作伙伴、供應商、公司與客戶之間都可能要建立連線通道以進行資訊傳送。為了在在Internet上為企業開通一條專用通道,以代替原來昂貴的專線租賃或幀中繼方式

JSON技術-Gson將bean轉換json確保資料的正確,使用FastJson將Json轉換Bean

一 、各個JSON技術的簡介和優劣 1.json-lib json-lib最開始的也是應用最廣泛的json解析工具,json-lib 不好的地方確實是依賴於很多第三方包, 包括commons-beanutils.jar,commons-collections-3.2.jar

各種介面技術比較

前言 縱觀這幾年,介面庫的發展可謂風聲水起,諷刺意味的是:大家對PC上的介面重視程度,來源於手機介面的發展。當蘋果出現時,徹底讓人們對介面的需求,提高了一個臺階。隨之而來的是粗糙介面的塞班介面的沒落。過去,人們不太重視軟體介面,把更多的精力放到程式功能上。現在人們越來越意識到,一個好的介面對產品的成功有時