gson使用教程-翻譯1

原文地址:http://www.studytrails.com/java/json/java-google-json-parse-json-to-java.jsp

1.json與java對象之間的互轉——Data Binding方式

gson提供兩種方式去將json解析成java對象.在這個教程中,我們將暫時不考慮泛型. 以下:
- 使用Gson類,使用這個類的public T fromJson(String json,Class classOfT)方法,classOfT就是你要解析成的Java對象的Class對象.
- 另一種方法就是使用GsonBuilder類,這個類允許設置某些特徵,例如可以設置解析null和自定義解析策略.使用這個類的時候,在設置完自定義的特徵之後,在通過build方法就可以獲取到Gson對象.

在這個教程中,我們將會以free music archive爲例.
你會看到這個json如下:

{
title: "Free Music Archive - Albums",
message: "",
errors: [ ],
total: "11259",
total_pages: 2252,
page: 1,
limit: "5",
dataset: [
{
......

首先,我們忽略掉dataset.我們爲根節點創建java類,叫Albums.爲了看起來更加簡潔,我們使用public的屬性.你也可以使用private的屬性和添加getter和setter.如下:

class Albums {
    public String title;
    public String message;
    public String[] errors = new String[]{};
    public String total;
    public int total_pages;
    public int page;
    public String limit;
}

接下來,我們把這個類解析成一個json,看

import com.google.gson.Gson;

public class JavaToJsonAndBack {

    public static void main(String[] args) {
        Albums albums = new Albums();
        albums.title = "Free Music Archive - Albums";
        albums.message = "";
        albums.total = "11259";
        albums.total_pages = 2252;
        albums.page = 1;
        albums.limit = "5";
        GsonBuilder builder = new GsonBuilder();
        Gson gson = builder.create();
        System.out.println(gson.toJson(albums));
    }
}

打印出來的結果:

{"title":"Free Music Archive - Albums","message":"","errors":[],
"total":"11259","total_pages":2252,"page":1,"limit":"5"}

注意一下,我們初始化了errors這個數組,才讓它呈現空的狀態,如果我們不初始化errors數據,gson將會忽略這個字段.在這種情況下只有我們設置允許Null解析時,纔會打印出null.所以,我們將使用一個List集合來代替:
public List<String> errors = new ArrayList<String>();
下一步就是構建dataset的類,dataset的json,看:

dataset: [
{
album_id: "7596",
album_title: "!!! - Live @ KEXP 7/24/2010",
......
album_images: [
{
image_id: "10574",
user_id: null,
.....
}
],
tags: [ ]

在這個教程中,我們僅僅考慮”dataset”的基本類型屬性和”album_images”兩者,剩餘的不予考慮.兩者的java類,看:

class Dataset {
    public String album_id;
    public String album_title;
}
class AlbumImages {
    public String image_id;
    public String user_id;
}

將DataSet解析成json,看:

Dataset dataset = new Dataset();
dataset.album_id = "7596";
dataset.album_title = "Album 1";
System.out.println(gson.toJson(dataset));

打印的結果:

{"album_id":"7596","album_title":"Album 1"}

將AlbumImages解析成json,看:

AlbumImages image = new AlbumImages();
image.image_id = "1";
System.out.println(gson.toJson(image));

打印結果:

{"image_id":"1"}

從打印結果來看,沒有賦值的user_id是沒有打印出來的,這裏我們可以使用GsonBuilder來設置Null解析,看:

builder.serializeNulls();

設置Null解析之後,打印結果:

{"image_id":"1","user_id":null}

接下來我們把上面建好的類聯繫起來,將AlbumImage添加到DataSet裏.

List<AlbumImages> images = new ArrayList<AlbumImages>();

然後把DataSet添加到Albums中

List<Dataset> dataset  = new ArrayList<Dataset>();

然後在代碼中關聯起來:

dataset.images.add(image);
albums.dataset.add(dataset);

打印結果:

{"title":"Free Music Archive - Albums","message":"","errors":[],"total":"11259",
"total_pages":2252,"page":1,"limit":"5",
"dataset":[{"album_id":"7596","album_title":"Album 1",
"images":[{"image_id":"1","user_id":null}]}]}

這樣的結果看起來好不爽,我們通過設置讓打印結果更清晰(通常在測試中使用,生成環境最好使用默認的設置)

builder.setPrettyPrinting().serializeNulls();

設置之後的結果:

{
  "title": "Free Music Archive - Albums",
  "message": "",
  "errors": [],
  "total": "11259",
  "total_pages": 2252,
  "page": 1,
  "limit": "5",
  "dataset": [
    {
      "album_id": "7596",
      "album_title": "Album 1",
      "images": [
        {
          "image_id": "1",
          "user_id": null
        }
      ]
    }
  ]
}

現在好多了,繼續,如果我們想要在json中”images”顯示爲”album_images”.同時我們又不可以把類中的字段名修改,這時我們可以通過使用SerializedName註解來爲這個字段指定一個別名,看:

@SerializedName("album_images")
List<AlbumImages> images = new ArrayList<AlbumImages>();

打印結果就看到”images”變爲”album_images”了:

"dataset": [
    {
      "album_id": "7596",
      "album_title": "Album 1",
      "album_images": [
        {
          "image_id": "1",
     .........

如果你是想在某一次的解析用到這個別名,我們可以通過代碼的方式來設置別名,我們先爲AlbumImage添加一個albumId的屬性,同時我們想在json看到的屬性爲”album_id”,代碼如下,看:

builder.setFieldNamingStrategy(new FieldNamingStrategy() {
            @Override
            public String translateName(Field f) {
                if (f.getName().equals("albumId"))
                    return "album_id";
                else
                    return f.getName();
            }
        });

translateName這個方法會在解析過程中解析到每一個屬性的時候都會被調用,我們在這個方法裏面通過匹配屬性名爲albumId的屬性,給這個屬性返回一個名爲的”album_id”的別名.打印結果:

"album_images": [
        {
          "image_id": "1",
          "user_id": null,
          "album_id": "10"
        }

GsonBuilder提供了很多的自定義的解析選項.你可以關閉Html轉義,排除一些字段(例如:排除所有的protected修飾的字段),設置自定義類型的轉換器,設置排除策略等,詳情可以查看官方的文檔.

好了,到這裏我們已經將目標的類構建出來了(漏掉的字段需要補充完整),我們可以通過Gson的fromJson方法將開始的json解析成Albums對象.看:

// url is the free music archive url.
Albums albums = gson.fromJson(IOUtils.toString(new URL(url)), Albums.class);

總結:
1.json轉Java,通過toJson()方法
2.Java轉json,通過fromJson()方法
3.通過builder.serializeNulls()方法來設置Null解析
4.通過builder.setPrettyPrinting()方法來設置打印格式
5.通過@SerializedName註解或者builder.setFieldNamingStrategy()爲屬性設置解析別名(注意兩者的區別).

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章