最近在項目中使用到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