2011-01-10 125 views
14

我與從谷歌的API客戶端在YouTube JSON工作:POJO解析GSON無效Java名稱

{ 
    "apiVersion": "2.0", 
    "data": { 
     "updated": "2011-01-05T13:48:33.146Z", 
     "totalItems": 4, 
     "startIndex": 1, 
     "itemsPerPage": 1, 
     "items": [ 
      { 
       "id": "YfUzMkAlOBI", 
       "uploaded": "2010-12-29T16:50:47.000Z", 
       "updated": "2010-12-29T16:50:47.000Z", 
       "uploader": "devandroidcs", 
       "category": "Entertainment", 
       "title": "Teste 2", 
       "description": "Description do teste2", 
       "tags": [ 
        "mobile" 
       ], 
       "thumbnail": { 
        "sqDefault": "http://i.ytimg.com/vi/YfUzMkAlOBI/default.jpg", 
        "hqDefault": "http://i.ytimg.com/vi/YfUzMkAlOBI/hqdefault.jpg" 
       }, 
       "player": { 
        "default": "http://www.youtube.com/watch?v\u003dYfUzMkAlOBI&feature\u003dyoutube_gdata_player", 
        "mobile": "http://m.youtube.com/details?v\u003dYfUzMkAlOBI" 
       } 
. 
. 
. 
} 

在這一點上,我要創造我的解析Java類稱爲默認字段名。 已經完成了這個解析與其他領域的工作,問題是,默認是 私人java名稱,所以我不能調用默認的變量。

我該如何管理?

回答

24

我相信你的答案就在JSON Field Naming Support

GSON支持一些預先定義的字段 命名策略轉換的 標準的Java字段名(即駱駝 套管名稱以小寫 ---「sampleFieldNameInJava」),以一個JSON字段名(即 sample_field_name_in_java或 sampleFieldNameInJava)。

例如見下面的例子:

private class SomeObject { 
    @SerializedName("custom_naming") private final String someField; 
    private final String someOtherField; 

    public SomeObject(String a, String b) { 
    this.someField = a; 
    this.someOtherField = b; 
    } 
} 

所以,你應該能夠定義字段映射到這樣的默認值:

@SerializedName("default") 
private final String someOtherNameThanDefault; 
1

如果您對映射字段使用@Key註釋,則只需使用可傳遞給此註釋的自定義值。因此,選擇合法的名稱爲您的領域,並將其映射爲@key(「默認」):

@Key("default") 
private String defaultUrl; 
+0

作爲手套的第一個解決方案..謝謝 – user569873 2011-01-10 15:11:06

+0

@ user569873:如果「第一個」解決方案的工作原理(我認爲你的意思是我的,因爲你說這一個沒有工作之前,你編輯你的評論),你應該表明接受這個答案,因爲這將有助於未來尋找同樣問題的人們。你應該爲此使用的每個問題的左側都有一個複選標記。 – Nailuj 2011-01-10 15:12:52

2

只是說從我個人的經驗,在選擇錯誤的Json解析器時,@Key可能無法用於序列化/反序列化。

(1)當您使用GSON解析器,如下圖所示:

GsonBuilder gsb = new GsonBuilder(); 
Gson gson = gsb.create(); 
OneDriveItem oneDriveItem = gson.fromJson(jasonData1, OneDriveItem.class); 

@key不工作,你應該使用@SerializedName註釋字段名。

(2)當您使用JsonFactory從包com.google.api.client.json,如下圖所示:

JacksonFactory jsonFactory=new JacksonFactory(); 

@key應該工作。