成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Java Json API:Gson使用簡(jiǎn)單入門(mén)

開(kāi)發(fā) 后端 開(kāi)發(fā)工具
GSON是Google開(kāi)發(fā)的Java API,用于轉(zhuǎn)換Java對(duì)象和Json對(duì)象。本文討論并提供了使用API的簡(jiǎn)單代碼示例。

GSON是Google開(kāi)發(fā)的Java API,用于轉(zhuǎn)換Java對(duì)象和Json對(duì)象。本文討論并提供了使用API的簡(jiǎn)單代碼示例。更多關(guān)于GSON的API可以訪問(wèn):http://sites.google.com/site/gson/.

[[148338]]

本文是GSON系列文章的***篇。本文是其他文章的基礎(chǔ),因此不需要任何GSON或JSON經(jīng)驗(yàn)。第二篇文章提供了關(guān)于GSON反序列化(從JSON到Java)的示例,第三篇文章提供了關(guān)于GSON序列化(從Java到JSON)的示例。

下面列出的所有代碼都可以在https://java-creed-examples.googlecode.com/svn/gson/Simple%20Gson%20Example. 找到。絕大部分示例都不會(huì)包含全部的代碼,可能會(huì)忽略一些片段,這些片段都與討論的示例無(wú)關(guān)。讀者可以從上面的鏈接下載或查閱所有代碼。

讀者需要有基礎(chǔ)的Java(教程)知識(shí)和很基礎(chǔ)的Maven(首頁(yè))知識(shí)。這里展示的代碼使用maven來(lái)下載GSON庫(kù)。把項(xiàng)目導(dǎo)入到Springsource Tool Suite(推薦的IDE),無(wú)需任何配置。

下載與安裝

在使用GSON API工作之前,你需要下載庫(kù)(jar文件),并將其包含到類(lèi)路徑中。庫(kù),連同源代碼和Java文檔,都可以從http://code.google.com/p/google-gson/downloads/list下載。下載完畢后,添加gson-<version>.jar到類(lèi)路徑。對(duì)于那些偏好使用Maven管理依賴(JAR文件)的讀者,添加如下依賴到pom.xml。

  1. <dependency> 
  2.     <groupId>com.google.code.gson</groupId> 
  3.     <artifactId>gson</artifactId> 
  4.     <version>2.2.4</version> 
  5. </dependency> 

需要修改 <version>2.2.4</version>。本文所有代碼示例使用上面列出的版本。pom.xml文件拷貝可以在這里找到。

如果這個(gè)庫(kù)用于web應(yīng)用,請(qǐng)確保在WEB-INF/lib文件夾中保持一份拷貝。或者,GSON庫(kù)可以放到應(yīng)用服務(wù)器提供給web應(yīng)用。

一個(gè)簡(jiǎn)單示例

GSON API提供一個(gè)類(lèi)文件,Gson(Java文檔),它被用來(lái)處理Java和JSON對(duì)象的轉(zhuǎn)換。可以調(diào)用默認(rèn)構(gòu)造器,或如下代碼的形式,使用GsonBuilder(Java文檔)類(lèi)創(chuàng)建這個(gè)類(lèi)的實(shí)例。GsonBuilder類(lèi)是可定制化的,并且允許開(kāi)發(fā)者按需實(shí)例化Gson。

  1. package com.javacreed.examples.gson.part1; 
  2.  
  3. import com.google.gson.Gson; 
  4. import com.google.gson.GsonBuilder; 
  5.  
  6. public class SimpleExample1 { 
  7.     public static void main(String[] args) { 
  8.         Gson gson = new GsonBuilder().create(); 
  9.         gson.toJson("Hello", System.out); 
  10.         gson.toJson(123, System.out); 
  11.     } 

在上面的例子中,我們創(chuàng)建了一個(gè)Gson實(shí)例,并把Java String和int轉(zhuǎn)化為JSON對(duì)象。以上代碼命令行里的輸出結(jié)果如下:

"Hello"123

這不是火箭科學(xué),但它是一個(gè)開(kāi)始。注意,上述的結(jié)果都將輸入到命令行。該toJason()方法有兩個(gè)參數(shù),Java對(duì)象轉(zhuǎn)換為JSON和可追加(Java的文檔)的一個(gè)實(shí)例。我們可以很容易地改變了一個(gè)文件或網(wǎng)絡(luò)流。

 

  1. package com.javacreed.examples.gson.part1; 
  2.  
  3. import java.io.FileWriter; 
  4. import java.io.IOException; 
  5. import java.io.Writer; 
  6. import com.google.gson.Gson; 
  7. import com.google.gson.GsonBuilder; 
  8.  
  9. public class SimpleExample2 { 
  10.     public static void main(String[] args) throws IOException { 
  11.         Writer writer = new FileWriter("Output.json"); 
  12.  
  13.         Gson gson = new GsonBuilder().create(); 
  14.         gson.toJson("Hello", writer); 
  15.         gson.toJson(123, writer); 
  16.  
  17.         writer.close(); 
  18.     } 

注意

為什么變量聲明為Writer類(lèi)型,而實(shí)際類(lèi)型是FileWriter?

盡量使用泛型是一個(gè)很好的方法。在上例中,我們只使用了Appendable和Writer接口定義的方法。使用泛型使代碼更易于移植和維護(hù),下面是個(gè)不好的例子。

注意,上面例子中,我們沒(méi)有正確處理流(Writer)。理想情況下,資源在finaly塊 (教程) 中關(guān)閉或者用在try-with-resource(教程)中。我們忽略了這個(gè)是為了保持代碼簡(jiǎn)潔。\

  1. public static void main(String[] args) throws IOException { 
  2.     try (Writer writer = new FileWriter("Output.json")) { 
  3.         Gson gson = new GsonBuilder().create(); 
  4.         gson.toJson("Hello", writer); 
  5.         gson.toJson(123, writer); 
  6.     } 

以上代碼生成文件:包含JSON對(duì)象的Output.json。注意,這里我們使用了字符流而不是字節(jié)流。因?yàn)閠oJson()方法需要一個(gè) Appendanble實(shí)例,而字節(jié)流不能實(shí)現(xiàn)Appendable接口,所以我們使用了字符流。Appendable接口處理字符而不是字節(jié)。Java 提供了InputStreanReader(Java文檔)和OutputStreamWriter(Java文檔)類(lèi)進(jìn)行字節(jié)流與字符流的轉(zhuǎn)換,如下面的例子。

注意

注意,使用InputStreamREader和OutputStreamWriter類(lèi)時(shí),如果不提供編碼或者字符集,轉(zhuǎn)換將使用平臺(tái)默認(rèn)字符集。這將降低代碼的可移植性,且在其他平臺(tái)上運(yùn)行將可能產(chǎn)生錯(cuò)誤行為。

 

  1. package com.javacreed.examples.gson.part1; 
  2.  
  3. import java.io.FileOutputStream; 
  4. import java.io.IOException; 
  5. import java.io.OutputStreamWriter; 
  6. import java.io.Writer; 
  7. import com.google.gson.Gson; 
  8. import com.google.gson.GsonBuilder; 
  9.  
  10. public class SimpleExample3 { 
  11.  
  12.     public static void main(String[] args) throws IOException { 
  13.         try(Writer writer = new OutputStreamWriter(new FileOutputStream("Output.json") , "UTF-8")){ 
  14.             Gson gson = new GsonBuilder().create(); 
  15.             gson.toJson("Hello", writer); 
  16.             gson.toJson(123, writer); 
  17.         } 
  18.     } 

如你所見(jiàn),我們只需要改變實(shí)例的一部分。代碼的剩余部分沒(méi)有任何變化。這就是使用接口代替類(lèi)作為變量類(lèi)型的好處之一。

使用JSON對(duì)象

比方說(shuō),我們需要使用JSON對(duì)象并加載他們?yōu)镴ava對(duì)象。假設(shè)web服務(wù)器查詢時(shí)產(chǎn)生如下JSON對(duì)象:

  1.   NAME:"Albert Attard"
  2.   P_LANGUAGE:"Java"
  3.   LOCATION:"Malta" 

此JSON對(duì)象包含3個(gè)不同值的域。比如我們需要使用JSON對(duì)象并創(chuàng)建一個(gè)Java對(duì)象來(lái)展示它。為了使這個(gè)例子更有趣,假設(shè)我們只關(guān)心name和location域。

首先創(chuàng)建一個(gè)Java類(lèi)來(lái)表示name和location。類(lèi)命名為Person。類(lèi)的名字無(wú)關(guān)緊要,但域的名字必須一致。域名必須匹配(大小寫(xiě)敏 感)JSON對(duì)象中的名字。更進(jìn)一步,類(lèi)必須包含一個(gè)默認(rèn)構(gòu)造函數(shù)(即使它被設(shè)置為private)。如下所示,name和location域在JSON 中是大寫(xiě)的。JSON中域P_LANGUAGE被忽略了,因?yàn)镴ava對(duì)象中不包括該名稱(chēng)的域。請(qǐng)理解域名不遵守Java命名規(guī)范,暫時(shí)只是為了簡(jiǎn)化。更 多內(nèi)容將在第2部分中討論。

 

  1. package com.javacreed.examples.gson.part2; 
  2.  
  3. public class Person { 
  4.     private String NAME; 
  5.     private String LOCATION; 
  6.  
  7.     // Getters and setters are not required for this example. 
  8.     // GSON sets the fields directly using reflection. 
  9.  
  10.     @Override 
  11.     public String toString() { 
  12.         return NAME + " - " + LOCATION; 
  13.     } 

準(zhǔn)備好Java對(duì)象后,我們可以讀取JSON對(duì)象并加載為Java對(duì)象,如下代碼所示。為了模擬真實(shí)情況,我們使用了字節(jié)流作為輸入。還要注意,JSON內(nèi)容保存在resource文件夾的文件里(這不是常規(guī)做法)。

 

  1. package com.javacreed.examples.gson.part2; 
  2.  
  3. import java.io.IOException; 
  4. import java.io.InputStreamReader; 
  5. import java.io.Reader; 
  6. import com.google.gson.Gson; 
  7. import com.google.gson.GsonBuilder; 
  8.  
  9. public class JsonToJava { 
  10.  
  11.     public static void main(String[] args) throws IOException { 
  12.         try(Reader reader = new InputStreamReader(JsonToJava.class.getResourceAsStream("/Server1.json"), "UTF-8")){ 
  13.             Gson gson = new GsonBuilder().create(); 
  14.             Person p = gson.fromJson(reader, Person.class); 
  15.             System.out.println(p); 
  16.         } 
  17.     } 

輸出如下:

Albert Attard - Malta

Gson解析JSON對(duì)象并創(chuàng)建了一個(gè)Person類(lèi)的實(shí)例,并打印到命令行中。

嵌套JSON對(duì)象

讓我們對(duì)上面的例子更進(jìn)一步,以下所示JSON代碼段包含了一個(gè)嵌套對(duì)象。

  1.   NAME:"Albert Attard"
  2.   P_LANGUAGE:"Java"
  3.   LOCATION:"Malta"
  4.   EXAM: { 
  5.     SUBJECT:"Programming"
  6.     GRADE:4.5 
  7.   } 

EXAM域由兩個(gè)域組成,分別是SUBJECT和GRADE。我們需要修改Person類(lèi)的定義來(lái)包含EXAM域,并創(chuàng)建一個(gè)新的Java類(lèi)來(lái)表示EXAM,該類(lèi)包含SUBJECT和GRADE域。

我們首先創(chuàng)建新的類(lèi)來(lái)表示嵌套對(duì)象。就像之前討論那樣,類(lèi)名無(wú)關(guān)緊要,但是域名必須與JSON中的域名匹配。

 

  1. package com.javacreed.examples.gson.part3; 
  2.  
  3. public class Exam { 
  4.     private String SUBJECT; 
  5.     private double GRADE; 
  6.  
  7.     // Getters and setters are not required for this example. 
  8.     // GSON sets the fields directly using reflection. 
  9.  
  10.     @Override 
  11.     public String toString() { 
  12.         return SUBJECT + " - " + GRADE; 
  13.     } 

現(xiàn)在我們可以修改Person類(lèi),引入一個(gè)與JSON中EXAM同名的域,類(lèi)型為Exam。注意,下面的Person類(lèi)與前一個(gè)<span style=”color: #ff0000;”>位于</span>不同的包。

 

  1. package com.javacreed.examples.gson.part3; 
  2.  
  3. public class Person { 
  4.  
  5.     private String NAME; 
  6.     private String LOCATION; 
  7.     private Exam EXAM; 
  8.  
  9.     @Override 
  10.     public String toString() { 
  11.         return NAME + " - " + LOCATION + " (" + EXAM + ")"
  12.     } 

注意,所需的變化是最小的,因?yàn)镚son動(dòng)態(tài)發(fā)現(xiàn)(使用反射)類(lèi)和它的域。本文不包含反射,對(duì)于更多關(guān)于反射的信息,請(qǐng)參考:Reflection in Action.

***,讓我們嘗試新的變化。

 

  1. package com.javacreed.examples.gson.part3; 
  2.  
  3. import java.io.IOException; 
  4. import java.io.InputStreamReader; 
  5. import java.io.Reader; 
  6. import com.google.gson.Gson; 
  7. import com.google.gson.GsonBuilder; 
  8.  
  9. public class JsonToJava { 
  10.  
  11.     public static void main(String[] args) throws IOException { 
  12.         try(Reader reader = new InputStreamReader(JsonToJava.class.getResourceAsStream("/Server2.json"), "UTF-8")){ 
  13.             Gson gson = new GsonBuilder().create(); 
  14.             Person p = gson.fromJson(reader, Person.class); 
  15.             System.out.println(p); 
  16.         } 
  17.     } 

JsonToJava類(lèi)沒(méi)有做任何改變,因?yàn)镚son使用了模型(Person和Exam類(lèi))將Json映射成Java。

結(jié)論

即使JSON可能是一個(gè)新概念,但它十分簡(jiǎn)單與直接。此外,相比于需要增加標(biāo)簽進(jìn)行消息/數(shù)據(jù)轉(zhuǎn)換而不斷膨脹的笨重的XML,它因?yàn)楹?jiǎn)單更加流行。 需要指出JSON是JavaScript的一個(gè)子集,JavaScript將它作為一個(gè)***的方案來(lái)進(jìn)行數(shù)據(jù)交換,例如網(wǎng)頁(yè)。GSON API使它更便于使用,即使在這里沒(méi)有討論的部分,它也提供了強(qiáng)大的靈活性。

欲了解更多GSON的例子,請(qǐng)移步第2部分,我們會(huì)探索更復(fù)雜的例子,并討論如何使用GSON解串器來(lái)完全控制反序列化過(guò)程。

 

責(zé)任編輯:王雪燕 來(lái)源: ImportNew
相關(guān)推薦

2011-03-01 11:28:54

2010-01-07 17:09:59

JSON 方法調(diào)用

2009-09-22 09:00:35

Hibernate A

2009-06-22 14:20:00

java線程入門(mén)

2019-05-24 08:48:33

JSONJacksonJSONP

2009-09-14 10:57:46

LINQ入門(mén)

2021-05-03 11:50:21

resuestsPython軟件開(kāi)發(fā)

2025-05-20 08:22:31

Gson內(nèi)核設(shè)計(jì)模式

2019-12-27 13:50:04

JavaAPI代碼

2009-09-24 13:12:20

Hibernate原生

2009-12-18 16:27:41

Ruby解析Json

2009-06-25 16:52:34

2009-06-12 09:07:01

EJB入門(mén)

2009-04-08 13:22:55

PHPXMLWeb Service

2021-01-15 13:24:41

fastjsongson框架

2024-12-03 08:43:49

2022-08-12 12:19:13

Cluster檢索集群

2011-09-16 14:21:47

Web API

2019-07-02 14:17:18

API網(wǎng)關(guān)網(wǎng)關(guān)流量

2011-07-20 10:27:29

JavaScript
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 日韩视频精品在线 | 九七午夜剧场福利写真 | 爱爱综合网 | 天天色官网 | 欧美激情在线播放 | 日韩在线视频精品 | 国产精品一区二区日韩 | 欧美中文视频 | 日韩国产在线 | 荷兰欧美一级毛片 | 91伊人网 | 精品日韩一区二区三区 | 欧美1区2区 | 天堂中文资源在线 | 在线看免费 | 欧美在线视频网 | 亚洲一区中文字幕在线观看 | 玖玖免费| 欧美日韩精品久久久免费观看 | 日韩精品中文字幕在线 | 免费一区二区三区 | 亚洲午夜视频 | 国产精品女人久久久 | 一区二区三区四区不卡视频 | 一区二区免费在线 | 精品在线看 | 亚洲精品一区二区网址 | 亚洲精品成人 | 又黄又色 | 能免费看的av | 亚洲电影第三页 | 久久精品成人 | 国产精品久久av | 国产区高清| 国产成人99久久亚洲综合精品 | 免费观看日韩av | 国产精品日韩欧美一区二区三区 | 99精品一区二区三区 | 一区二区精品 | 久久久久久久久国产 | 欧美大片一区二区 |