問題:JSON數(shù)據(jù)如何進行解析呢蔚出,方式有哪些?

問題:JSON數(shù)據(jù)如何進行解析呢含懊,方式有哪些身冬?

這個問題是我們作為程序員幾乎每天都要進行的操作,那它有多少種方式呢岔乔,我們這里就這點來說一說酥筝。

解析的四種方式

官方解析

谷歌 Gson 解析

阿里巴巴 FastJson 解析

Jackson 解析

案例實操

這里我們就只討論對象與 json 如何互相轉(zhuǎn)換。

這里我們先創(chuàng)建好 Maven 項目雏门,方便引入依賴嘿歌,通過單元測試來實際檢驗我們不同的解析方式。

下面我們都使用 User 對象茁影,先創(chuàng)建好我們需要的類宙帝。

User.java

packageorg.example;

?

publicclassUser{

?

privateStringname;

privateStringsex;

privateIntegerage;

?

publicUser() {

?? }

?

publicUser(Stringname,Stringsex,Integerage) {

this.name=name;

this.sex=sex;

this.age=age;

?? }

?

publicStringgetName() {

returnname;

?? }

?

publicvoidsetName(Stringname) {

this.name=name;

?? }

?

publicStringgetSex() {

returnsex;

?? }

?

publicvoidsetSex(Stringsex) {

this.sex=sex;

?? }

?

publicIntegergetAge() {

returnage;

?? }

?

publicvoidsetAge(Integerage) {

this.age=age;

?? }

?

@Override

publicStringtoString() {

return"User{"+

"name='"+name+'\''+

", sex='"+sex+'\''+

", age="+age+

'}';

?? }


}

?

官方解析

官方提供的 json 解析方式,比較繁瑣募闲,所以用的人比較少步脓。

第一步,引入依賴:

<!--json官方-->

<dependency>

<groupId>org.json</groupId>

<artifactId>json</artifactId>

<version>20160810</version>

</dependency>

第二步,編寫測試代碼:

packageorg.example;

?

importorg.json.JSONObject;

importorg.springframework.stereotype.Component;

?

/**

* 官方解析

*/

@Component

publicclassJsonTest1{

?

/**

* 對象轉(zhuǎn)json

* @param user

* @return

*/

publicStringuserToJson(Useruser){

JSONObjectjsonObject=newJSONObject(user);

StringjsonStr=jsonObject.toString();

returnjsonStr;

?? }

?

/**

* json轉(zhuǎn)對象

* @param json

* @return

*/

publicUseruserFromJson(Stringjson){

JSONObjectjsonObject=newJSONObject(json);

Stringname=jsonObject.getString("name");

Stringsex=jsonObject.getString("sex");

intage=jsonObject.getInt("age");

Useruser=newUser(name,sex,age);

returnuser;

?? }

?

}

第三步靴患,單元測試:

packageorg.example;

?

importorg.junit.Test;

importorg.junit.runner.RunWith;

importorg.springframework.beans.factory.annotation.Autowired;

importorg.springframework.test.context.ContextConfiguration;

importorg.springframework.test.context.junit4.SpringJUnit4ClassRunner;

?

@RunWith(SpringJUnit4ClassRunner.class)

@ContextConfiguration(locations="classpath:spring.xml")

publicclassJsonTest1Test{

?

@Autowired

privateJsonTest1jsonTest1;

?

@Test

publicvoiduserToJson() {

Useruser=newUser("秦明","man",18);

Stringjson=jsonTest1.userToJson(user);

System.out.println(json);

?? }

?

@Test

publicvoiduserFromJson() {

Stringjson="{\"sex\":\"man\",\"name\":\"秦明\",\"age\":18}";

Useruser=jsonTest1.userFromJson(json);

System.out.println(user);

?? }

}

第四步仍侥,查看結(jié)果:

谷歌 Gson 解析

第一步,引入依賴:

<!--gson-->

<dependency>

<groupId>com.google.code.gson</groupId>

<artifactId>gson</artifactId>

<version>2.8.5</version>

</dependency>

第二步鸳君,編寫測試代碼:

packageorg.example;

?

importcom.google.gson.Gson;

importorg.springframework.stereotype.Component;

?

/**

* gson解析

*/

@Component

publicclassJsonTest2{

?

/**

* 對象轉(zhuǎn)json

* @param user

* @return

*/

publicStringuserToJson(Useruser){

Gsongson=newGson();

Stringjson=gson.toJson(user);

returnjson;

?? }

?

/**

* json轉(zhuǎn)對象

* @param json

* @return

*/

publicUseruserFromJson(Stringjson){

Gsongson=newGson();

Useruser=gson.fromJson(json,User.class);

returnuser;

?? }

?

}

第三步农渊,單元測試:同上(下面第三步和第四步和上面都一樣,所以下面省略)

第四步或颊,查看結(jié)果:同上

阿里巴巴 FastJson 解析

這個解析方式是由阿里巴巴開發(fā)出來的砸紊,效率最高,深受大家喜愛囱挑,功能強大醉顽,想要更深入學(xué)習(xí)的可以查看 FastJson 官網(wǎng)API。

第一步平挑,引入依賴:

<!--fastjson-->

<dependency>

<groupId>com.alibaba</groupId>

<artifactId>fastjson</artifactId>

<version>1.2.47</version>

</dependency>

第二步徽鼎,編寫測試代碼:

packageorg.example;

?

importcom.alibaba.fastjson.JSONObject;

importorg.springframework.stereotype.Component;

?

/**

* fastjson解析

*/

@Component

publicclassJsonTest3{

?

/**

* 對象轉(zhuǎn)json

* @param user

* @return

*/

publicStringuserToJson(Useruser){

Stringjson=JSONObject.toJSONString(user);

returnjson;

?? }

?

/**

* json轉(zhuǎn)對象

* @param json

* @return

*/

publicUseruserFromJson(Stringjson){

Useruser=JSONObject.parseObject(json,User.class);

returnuser;

?? }

?

}

Jackson 解析

這個解析方式是在目前我們使用最流行的一些框架比如 SSM、SpringBoot弹惦,其內(nèi)部的 json 解析使用的就是 Jackson,但往往我們會另外引入 FastJson 來使用悄但,因為速度更快棠隐。

第一步,引入依賴:

<!--jackson-->

<dependency>

<groupId>com.fasterxml.jackson.core</groupId>

<artifactId>jackson-databind</artifactId>

<version>2.9.8</version>

</dependency>

第二步檐嚣,編寫測試代碼:

packageorg.example;

?

importcom.fasterxml.jackson.core.JsonProcessingException;

importcom.fasterxml.jackson.databind.ObjectMapper;

importorg.springframework.stereotype.Component;

?

importjava.io.IOException;

?

/**

* jackson解析

*/

@Component

publicclassJsonTest4{

?

/**

* 對象轉(zhuǎn)json

* @param user

* @return

*/

publicStringuserToJson(Useruser)throwsJsonProcessingException{

ObjectMapperobjectMapper=newObjectMapper();

Stringjson=objectMapper.writeValueAsString(user);

returnjson;

?? }

?

/**

* json轉(zhuǎn)對象

* @param json

* @return

*/

publicUseruserFromJson(Stringjson)throwsIOException{

ObjectMapperobjectMapper=newObjectMapper();

Useruser=objectMapper.readValue(json,User.class);

returnuser;

?? }

?

}

擴展~JSON的誕生

JSON 的誕生是因為 XML 整合到 HTML 中各個瀏覽器實現(xiàn)的細節(jié)不盡相同助泽,所以道格拉斯·克羅克福特(Douglas Crockford)和 奇普·莫寧斯達(Chip Morningstar)一起從 JS 的數(shù)據(jù)類型中提取了一個子集,作為新的數(shù)據(jù)交換格式嚎京,因為主流的瀏覽器使用了通用的 JavaScript 引擎組件嗡贺,所以在解析這種新數(shù)據(jù)格式時就不存在兼容性問題,于是他們將這種數(shù)據(jù)格式命名為 “JavaScript Object Notation”鞍帝,縮寫為 JSON诫睬,由此 JSON 便誕生了!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末帕涌,一起剝皮案震驚了整個濱河市摄凡,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌蚓曼,老刑警劉巖亲澡,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異纫版,居然都是意外死亡床绪,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來癞己,“玉大人膀斋,你說我怎么就攤上這事∧┩海” “怎么了概页?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長练慕。 經(jīng)常有香客問我惰匙,道長,這世上最難降的妖魔是什么铃将? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任项鬼,我火速辦了婚禮,結(jié)果婚禮上劲阎,老公的妹妹穿的比我還像新娘绘盟。我一直安慰自己,他們只是感情好悯仙,可當(dāng)我...
    茶點故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布龄毡。 她就那樣靜靜地躺著,像睡著了一般锡垄。 火紅的嫁衣襯著肌膚如雪沦零。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天货岭,我揣著相機與錄音路操,去河邊找鬼。 笑死千贯,一個胖子當(dāng)著我的面吹牛屯仗,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播搔谴,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼魁袜,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了敦第?” 一聲冷哼從身側(cè)響起慌核,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎申尼,沒想到半個月后垮卓,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡师幕,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年粟按,在試婚紗的時候發(fā)現(xiàn)自己被綠了诬滩。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,039評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡灭将,死狀恐怖疼鸟,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情庙曙,我是刑警寧澤空镜,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站捌朴,受9級特大地震影響吴攒,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜砂蔽,卻給世界環(huán)境...
    茶點故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一洼怔、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧左驾,春花似錦镣隶、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至帆吻,卻和暖如春嗜闻,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背桅锄。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留样眠,地道東北人友瘤。 一個月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像檐束,于是被迫代替她去往敵國和親辫秧。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,786評論 2 345

推薦閱讀更多精彩內(nèi)容