Gson初接觸

最近在項目中使用到Gson,so cool,因而上官網進一步瞭解Gson,瞭解下爲什麼要使用Gson,Gson提供了哪些便利,介紹性文章, 不作深刻探討。java


Gson庫的目標,官方的說法是web

Goals for Gsonjson

* Provide easy to use mechanisms like toString() and constructor (factory method) to convert Java to JSON and vice-versa
數據結構

* Allow pre-existing unmodifiable objects to be converted to and from JSONide

* Allow custom representations for objectsui

* Support arbitrarily complex objectthis

* Generate compact and readability JSON output編碼

簡單來講有幾個比較酷的特色吧 spa

1. 提供了機制可以很方便得實現Java對象和Json字符串的互轉。調試

2. 支持容器和泛型類型。


第1點是我最喜歡的,可以將對象以結構化的形式保存到字符串中。

下面的代碼段描述了 Device對象和String的互轉

public void testWriteJson(){
		Device device = new Device();
		device.setNickName("class one");
        ...		
		
		Gson gson = new Gson();
		String jsonString = gson.toJson(device);
		
		try {  
			   //write converted json data to a file named "CountryGSON.json"  
			   FileWriter writer = new FileWriter(mFile);  
			   writer.write(jsonString);  
			   writer.close();  
			    
			  } catch (IOException e) {  
			   e.printStackTrace();  
			  }  
	}
	
	public void testReadJson(){
		Gson gson = new Gson();
		
		try {
			BufferedReader br = new BufferedReader(  
				     new FileReader(mFile));
			
			Device device = gson.fromJson(br, Device.class);
			
			{
				Gson gson2 = new Gson();
				String jsonString = gson2.toJson(device);
				Log.i("kesy", jsonString);
			}
			
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}
	}

還有幾個有意思的輔助特色

1.  Json字符串默認是沒有縮進格式的,gson支持縮進,這在開發調試階段有所用途,方便肉眼查看。

        Gson gson = new GsonBuilder().setPrettyPrinting().create();

        String jsonOutput = gson.toJson(someObject);

2. Gson導出的Json字符串默認不會記錄值爲null的field,以減少字符串的字節數,這就要求java有默認值的處理。

3. Gson有版本支持,某種程度上支持數據結構的向後兼容,方便產品的迭代。 

public class VersionedClass {
  @Since(1.1) private final String newerField;
  @Since(1.0) private final String newField;
  private final String field;
  public VersionedClass() {
    this.newerField = "newer";
    this.newField = "new";
    this.field = "old";
  }
}
VersionedClass versionedObject = new VersionedClass();
Gson gson = new GsonBuilder().setVersion(1.0).create();
String jsonOutput = gson.toJson(someObject);
System.out.println(jsonOutput);
System.out.println();
gson = new Gson();
jsonOutput = gson.toJson(someObject);
System.out.println(jsonOutput);
======== OUTPUT ========
{"newField":"new","field":"old"}
{"newerField":"newer","newField":"new","field":"old"}

4. 能夠指定哪些field不參與序列化和反序列化,更加靈活

5. 能夠更改序列化後域的名稱,好比域名稱是個相對較長的字符串如"mCurrentTime",你能夠在序列化時,改成"ct"





IT是個變化很快的行業,想了解最新,最酷的特性只能上官網去查找。


人類一思考,上帝就發笑。

站在巨人的肩膀上編碼的,

並不是鉅細都出自本身的思考,

不免會有誤差,

如有誤,歡迎指正。

------------by jackson.ke

相關文章
相關標籤/搜索