摘要:在包中有這么個(gè)的包用于對(duì)數(shù)據(jù)進(jìn)行序列化處理。而還有一些其他的內(nèi)容比如對(duì)指定類(lèi)型的序列化處理這里就不敘述了可以參考。
原文地址:http://blog.52sox.com/use-gso...
關(guān)于為什么突然會(huì)使用Java,實(shí)際上還是公司要將之前原先Python開(kāi)發(fā)的Elasticsearch搜索集成到到項(xiàng)目中,而必須在國(guó)慶前給出1個(gè)版本。真心的說(shuō),進(jìn)度很趕,對(duì)于一個(gè)平時(shí)不怎么寫(xiě)Java的Pythoner來(lái)說(shuō),花了1天的時(shí)間把對(duì)應(yīng)的功能完成的70%,不得不說(shuō)是1個(gè)奇跡。
在Jest包中,有這么1個(gè)Gson的包,用于對(duì)JSON數(shù)據(jù)進(jìn)行序列化處理。這里我們多帶帶將其拿出來(lái),稍微簡(jiǎn)單的介紹一下,以后遇到同樣的問(wèn)題的時(shí)候也不用慌。這里使用的gson版本為2.8.0。
我們使用maven下載了對(duì)應(yīng)的包后,首先進(jìn)行如下的操作:
import com.google.gson.*;序列化
接著我們實(shí)例化Gson類(lèi),并調(diào)用其toJson方法對(duì)1個(gè)對(duì)象進(jìn)行序列化處理:
import java.util.*; ... public class demo { public static void main(String[] args){ Gson json = new Gson(); HashMapmap = new HashMap<>(); ArrayList arr = new ArrayList<>(); arr.add("張三"); arr.add("李四"); map.put("person", arr); String str = json.toJson(map); System.out.println(str); } }
其結(jié)果如下所示:
{"person":["張三","李四"]}
可以說(shuō)是1個(gè)非常簡(jiǎn)單的例子。但是上面的方式,對(duì)于數(shù)值為null的情況會(huì)忽略掉對(duì)應(yīng)的鍵名,如下所示:
HashMapmap = new HashMap<>(); ArrayList arr = new ArrayList<>(); arr.add("張三"); arr.add("李四"); map.put("person", arr); map.put("gender", null); String str = json.toJson(map);
其結(jié)果為:
{"person":["張三","李四"]}
此時(shí)我們可以使用如下的方式進(jìn)行序列化:
GsonBuilder json = new GsonBuilder(); String str = json.serializeNulls().create().toJson(map);
另外,默認(rèn)的序列化是沒(méi)有美化效果的,看起來(lái)不是很方便,此時(shí)我們可以添加setPrettyPrinting方法來(lái)設(shè)置其為美化的輸出:
String str = json.serializeNulls().setPrettyPrinting().create().toJson(map);
相應(yīng)的結(jié)果立即就變成了:
{ "gender": null, "person": [ "張三", "李四" ] }
除此之外,我們還可以對(duì)類(lèi)進(jìn)行實(shí)例化,比如我們有如下1個(gè)簡(jiǎn)單的類(lèi):
class Person { private String name = "張三"; private int age = 23; private String gender = "男"; @Override public String toString(){ return name + ":" + age + ":" + gender; } }
接著我們?cè)龠M(jìn)行實(shí)例化處理:
Person person = new Person(); String str = json.toJson(person); System.out.println(str);
其結(jié)果為:
{"name":"張三","age":23,"gender":"男"}
可以看到,對(duì)應(yīng)類(lèi)的屬性都被實(shí)例化了。另外,在這里我們對(duì)類(lèi)的toString進(jìn)行了重載,也是1種序列化的方式。
另1個(gè)比較有意思的地方,可能就是使用注解的方式來(lái)進(jìn)行序列化處理了,例如:
import com.google.gson.annotations.*; class Person { @SerializedName("username") @Expose(serialize = true) private String name = "張三"; private int age = 23; @Expose(serialize = true) private String gender = "男"; } ... Person person = new Person(); String str2 = json.serializeNulls().excludeFieldsWithoutExposeAnnotation().create().toJson(person); System.out.println(str2);
在這里我們只序列化name和gender這個(gè)2個(gè)屬性,其中屬性name序列化時(shí)候的名稱(chēng)為username,之后我們調(diào)用GsonBuilder進(jìn)行處理可以得到:
{"username":"張三","gender":"男"}反序列化
而對(duì)于反序列化處理,我們只需要使用fromJson函數(shù)即可,例如我們可以對(duì)之前的JSON數(shù)據(jù)進(jìn)行反序列化處理:
Person info = json.create().fromJson(str2, Person.class); System.out.println(info);
由于我們之前重載了對(duì)應(yīng)類(lèi)的toString方法,因此其結(jié)果為:
張三:23:男
另1個(gè)就是對(duì)之前新建的HashMap進(jìn)行反序列化處理:
HashMap, ?> dict = json.create().fromJson(str, HashMap.class); System.out.println(dict);
其結(jié)果為:
{gender=null, person=[張三, 李四]}
通過(guò)反序列化,在調(diào)用Jest時(shí)對(duì)于返回的數(shù)據(jù),我們就可以進(jìn)行篩選,去除一些不需要的內(nèi)容再序列化返回到前端。
而Gson還有一些其他的內(nèi)容,比如對(duì)指定類(lèi)型的序列化處理,這里就不敘述了,可以參考。
參考文章:
http://www.javadoc.io/doc/com...
https://www.cnblogs.com/mafly...
https://www.cnblogs.com/majay...
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/77213.html
摘要:版本版本簡(jiǎn)介是谷歌開(kāi)源的解析工具。其實(shí)幾款產(chǎn)品的差別都很細(xì)微,有谷歌的信仰加成,所以在這里進(jìn)行一次源碼分析。至于和會(huì)在后續(xù)進(jìn)行追蹤。 零 前期準(zhǔn)備 0 FBI WARNING 文章異常啰嗦且繞彎。 1 版本 Gson 版本 : gson 2.8.5 IDE : idea 2018.3 2 Gson 簡(jiǎn)介 Gson 是谷歌開(kāi)源的 java json 解析工具。市場(chǎng)上同類(lèi)的開(kāi)源產(chǎn)品還有 F...
摘要:六修改內(nèi)部類(lèi)的方法這個(gè)的方法是對(duì)類(lèi)型的數(shù)據(jù)進(jìn)行解析,我們判斷輸入的數(shù)據(jù)類(lèi)型不是類(lèi)型,就直接跳過(guò)解析,核心是在方法中插入方法。每一個(gè)類(lèi)每一個(gè)內(nèi)部類(lèi)每一個(gè)匿名內(nèi)部類(lèi),都會(huì)生成一個(gè)獨(dú)立的文件,如。 一、項(xiàng)目地址 項(xiàng)目地址:github-gson-plugin 二、ReaderTools解析 /** * Created by tangfuling on 2018/10/23. */ pu...
閱讀 3410·2021-09-22 15:01
閱讀 535·2019-08-30 11:11
閱讀 965·2019-08-29 16:17
閱讀 1218·2019-08-29 12:23
閱讀 2036·2019-08-26 11:48
閱讀 3189·2019-08-26 11:48
閱讀 1427·2019-08-26 10:33
閱讀 1938·2019-08-26 10:30