本博客是一個純技術(shù)交流博客搜贤,寫出來的文章是幫大家解決一些問題,或讓大家有個參考和思路钝凶,更多技術(shù)分享請關(guān)注http://blog.36dr.net仪芒,有任何問題可與我郵件dr.kalen@yahoo.com。
概述
在開發(fā)領(lǐng)域中數(shù)據(jù)傳遞有很多形式耕陷,通常數(shù)據(jù)調(diào)用交互采用XML掂名,JSON,數(shù)據(jù)流哟沫,純文本等形式饺蔑;越來越多數(shù)據(jù)調(diào)用采用JSON,因為JSON數(shù)據(jù)結(jié)構(gòu)簡單嗜诀,數(shù)據(jù)字節(jié)長度短猾警,既簡單又快速何樂而不為呢?
從JSON的結(jié)構(gòu)入手隆敢,所有json數(shù)據(jù)最終分為三種情況:
- 標量(Scalar)发皿,也就是單純的字符串或則數(shù)字形式
- 序列(Sequence),也就是若干數(shù)據(jù)按照一定順序并列在一起又稱“數(shù)組”
- 映射(Mapping)拂蝎,也就是key/value鍵值對
Json的規(guī)格非常簡單,此文章就不一一描述:
"{"name":"kalen", "age":22}"
默認Gson只能序列和反序列基本數(shù)據(jù)類型和Date類型穴墅,其他類型如枚舉都需要自定義解析器registerTypeAdapter
在Android開發(fā)是使用:
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.1</version>
</dependency>
or
compile 'com.google.code.gson:gson:2.3.1'
Gson 快速使用
- 普通對象(Mapping)數(shù)據(jù)解析
String json_str = "{"name":"kalen", "age":22}";
Gson gson = new Gson();
User user = gson.fromGson(json_str, User.class);
通過Gson中的fromGson即可將JSON數(shù)據(jù)解析并且賦值到User對象中,Gson原理則采用反射機制實現(xiàn),具體可Google查詢Gson原理玄货。
- 數(shù)組數(shù)據(jù)(Sequence)數(shù)據(jù)解析
Type listType = new TypeToken<List<String>>() {}.getType();//數(shù)組對應(yīng)gson中的類型
List<String> target = new LinkedList<String>();//gson需要的轉(zhuǎn)換對象或則數(shù)據(jù)來源
target.add("blah");
Gson gson = new Gson();
String json = gson.toJson(target, listType);
List<String> target2 = gson.fromJson(json, listType);
Gson高級使用
1.GsonBuilder
Gson是通過GsonBuilder生成皇钞,設(shè)定Gson的序列化和返序列號數(shù)據(jù)如:
Gson gson = new GsonBuilder()
.registerTypeAdapter(Id.class, new IdTypeAdapter())
.enableComplexMapKeySerialization()
.serializeNulls()
.setDateFormat(DateFormat.LONG)
.setFieldNamingPolicy(FieldNamingPolicy.UPPER_CAMEL_CASE)//會把字段首字母大寫
.setPrettyPrinting()
.setVersion(1.0)
.create();
以上則是單獨對Id類設(shè)置了獨立解析方式,以及設(shè)置時間的解析格式為長時間形式松捉。
2.@Expose注解
如果采用new Gson()方式創(chuàng)建Gson則@Expose則沒有任何效果夹界,若采用GsonBuilder創(chuàng)建Gson并且調(diào)用了excludeFieldsWithoutExposeAnnotation則@Expose將會影響toJson和fromGson序列化和反序列化數(shù)據(jù)。如:
public class User {
@Expose private String firstName;
@Expose(serialize = false) private String lastName;
@Expose(serialize = false, deserialize = false)
private String emailAddress;
private String password;
}
例子中password不管是toJson還是fromJson都不會用到隘世,emailAddress和lastName在序列化(fromJson)時將被采用掉盅,emailAddress在反序列化(toJson)時將不被采用。
可以通過@SerializedName對序列字段進行重命名以舒,也可以自定義注解然后設(shè)置Gson字段解析策略setFieldNamingStrategy,具體在Retrofit Demo中有應(yīng)用。
3.GsonBuilder方法解釋
- setFieldNamingPolicy 設(shè)置序列字段的命名策略(UPPER_CAMEL_CASE,UPPER_CAMEL_CASE_WITH_SPACES,LOWER_CASE_WITH_UNDERSCORES,LOWER_CASE_WITH_DASHES)
- addDeserializationExclusionStrategy 設(shè)置反序列化時字段采用策略ExclusionStrategy慢哈,如反序列化時不要某字段蔓钟,當然可以采用@Expore代替。
- excludeFieldsWithoutExposeAnnotation 設(shè)置沒有@Expore則不序列化和反序列化
- addSerializationExclusionStrategy 設(shè)置序列化時字段采用策略卵贱,如序列化時不要某字段滥沫,當然可以采用@Expore代替。
- registerTypeAdapter 為某特定對象設(shè)置固定的序列和反序列方式键俱,實現(xiàn)JsonSerializer和JsonDeserializer接口
- setFieldNamingStrategy 設(shè)置字段序列和反序列時名稱顯示兰绣,也可以通過@Serializer代替
- setPrettyPrinting 設(shè)置gson轉(zhuǎn)換后的字符串為一個比較好看的字符串
- setDateFormat 設(shè)置默認Date解析時對應(yīng)的format格式