我的Java路上那些事兒

          快樂(lè)成長(zhǎng)
          posts - 110, comments - 101, trackbacks - 0, articles - 7
            BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

          google-gson-2.1-release.zip

          -----------------------------------------------------------------

          掃盲:

          Json是一種類(lèi)似于XML的通用數(shù)據(jù)交換格式,具有比XML更高的傳輸效率.

           

          從結(jié)構(gòu)上看,所有的數(shù)據(jù)(data)最終都可以分解成三種類(lèi)型:

          第一種類(lèi)型是標(biāo)量(scalar),也就是一個(gè)單獨(dú)的字符串(string)或數(shù)字(numbers),比如"北京"這個(gè)單獨(dú)的詞。

          第二種類(lèi)型是序列(sequence),也就是若干個(gè)相關(guān)的數(shù)據(jù)按照一定順序并列在一起,又叫做數(shù)組(array)或列表(List),比如"北京,上海"。

          第三種類(lèi)型是映射(mapping),也就是一個(gè)名/值對(duì)(Name/value),即數(shù)據(jù)有一個(gè)名稱(chēng),還有一個(gè)與之相對(duì)應(yīng)的值,這又稱(chēng)作散列(hash)或字典(dictionary),比如"首都:北京"。

           

          Json的規(guī)格非常簡(jiǎn)單,只用一個(gè)頁(yè)面幾百個(gè)字就能說(shuō)清楚,而且Douglas Crockford聲稱(chēng)這個(gè)規(guī)格永遠(yuǎn)不必升級(jí),因?yàn)樵撘?guī)定的都規(guī)定了。

          1) 并列的數(shù)據(jù)之間用逗號(hào)(",")分隔。

          2) 映射用冒號(hào)(":")表示。

          3) 并列數(shù)據(jù)的集合(數(shù)組)用方括號(hào)("[]")表示。

          4) 映射的集合(對(duì)象)用大括號(hào)("{}")表示。

          -----------------------------------------------------------------

          最快速入門(mén)貼:

          1. 對(duì)象的序列化和反序列化

           

          Type listType = new TypeToken<List<String>>() {}.getType();
          List<String> target = new LinkedList<String>(); 

          target.add("blah");

           Gson gson = new Gson(); 

          String json = gson.toJson(target, listType); 

          List<String> target2 = gson.fromJson(json, listType);

           OK,最簡(jiǎn)方案打完收工.
          2.使用GsonBuilder.
          GsonBuilder用來(lái)生成Gson對(duì)象. 規(guī)定Gson的序列化和返序列化時(shí)的格式等內(nèi)容.
          如:

          Gson gson = new GsonBuilder()
          .registerTypeAdapter(Id.class, new IdTypeAdapter())  

                  .enableComplexMapKeySerialization() 

               .serializeNulls()  

                   .setDateFormat(DateFormat.LONG)  

                  .setFieldNamingPolicy(FieldNamingPolicy.UPPER_CAMEL_CASE)//會(huì)把字段首字母大寫(xiě)

                 .setPrettyPrinting() 

               .setVersion(1.0)  

                   .create();

          3. 使用注解,定制序列化字段.
          默認(rèn)情況下@Expose注解是不起作用的,除非你用GsonBuilder創(chuàng)建Gson的時(shí)候調(diào)用了GsonBuilder.excludeFieldsWithoutExposeAnnotation()方法

           

           

          來(lái)個(gè)例子:

           

          public class User { 

          @Expose private String firstName; 

           @Expose(serialize = false) private String lastName;

           @Expose (serialize = false, deserialize = false) 

          private String emailAddress; private String password;

           }

          如果你創(chuàng)建Gson對(duì)象的時(shí)候使用的是new Gson(),toJson()和fromJson()方法將會(huì)對(duì)全部的字段生效.但是如果你使用的是GsonBuilder并且調(diào)用了excludeFieldsWithoutExposeAnnotation()方法.那么:toJson()和fromJson()將不會(huì)包括password.因?yàn)閜assword沒(méi)有包含@Expose注解.
          序列化的時(shí)候?qū)⒉话?lastName和emailAddress,因?yàn)樽⒔庵袠?biāo)明不進(jìn)行序列化.同樣的道理,反序列化時(shí)將不包括emailAddress.
          注:如果僅僅是想把某些特定的字段包含在外和話,可以使用transient 關(guān)鍵字聲明字段.
          4. 使用注解對(duì)序列化名稱(chēng)進(jìn)行聲明
          這個(gè)簡(jiǎn)單,上例子都能懂,不解釋:

          public class SomeClassWithFields {

          @SerializedName("name")
          private final String someField;  

            private final String someOtherField;  

          public SomeClassWithFields(String a, String b) {  

          this.someField = a;
          this.someOtherField = b; 

          }

          ===== OUTPUT =====

          {"name":"a","someOtherField":"b"}

          5. 例用注解,根據(jù)版本進(jìn)行序列化
          有的字段不是一開(kāi)始就有的,會(huì)隨著版本的升級(jí)添加進(jìn)來(lái),那么在進(jìn)行序列化和返序列化的時(shí)候就會(huì)根據(jù)版本號(hào)來(lái)選擇是否要序列化.
          @Since(版本號(hào))能完美地實(shí)現(xiàn)這個(gè)功能.
          當(dāng)然,GsonBuilder.setVersion(double)方法需要調(diào)用.
          例程如下:

          public class User {  

          private String firstName;  

          private String lastName;  

          @Since(1.0) private String emailAddress;  

          @Since(1.0) private String password;

          @Since(1.1) private Address address;

          }

          還的字段可能,隨著版本的升級(jí)而刪除,那么
          @Until(版本號(hào))也能實(shí)現(xiàn)這個(gè)功能,GsonBuilder.setVersion(double)方法需要調(diào)用.

          public class User {  

              private String firstName;  

              private String lastName; 

          @Until(1.1) private String emailAddress;  

          @Until(1.1) private String password;

          }


          maven pom.xml 設(shè)置
            <dependency>
             <groupId>com.google.code.gson</groupId>
             <artifactId>gson</artifactId>
             <version>2.1</version>
            </dependency>









          評(píng)論

          # re: google-gson 序列化Object to json ,GsonBuilder設(shè)置 如version意義,注解 等  回復(fù)  更多評(píng)論   

          2012-10-30 16:23 by cailiang
          很詳細(xì)

          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 三都| 长顺县| 岗巴县| 佛冈县| 牙克石市| 营山县| 淳安县| 澄迈县| 藁城市| 高尔夫| 交口县| 定兴县| 宁南县| 黎平县| 广东省| 谷城县| 乐安县| 舞钢市| 长治县| 鄯善县| 康定县| 长丰县| 和硕县| 韩城市| 屏南县| 丰宁| 东方市| 彩票| 莱阳市| 八宿县| 洮南市| 南岸区| 齐齐哈尔市| 侯马市| 荣成市| 龙门县| 博白县| 汕尾市| 苍梧县| 康定县| 铜川市|