POJO解析GSON无效Java名称

问题描述:

我与从谷歌的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名称,所以我不能调用默认的变量。

我该如何管理?

我相信你的答案就在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; 

如果您对映射字段使用@Key注释,则只需使用可传递给此注释的自定义值。因此,选择合法的名称为您的领域,并将其映射为@key(“默认”):

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

作为手套的第一个解决方案..谢谢 – user569873 2011-01-10 15:11:06

+0

@ user569873:如果“第一个”解决方案的工作原理(我认为你的意思是我的,因为你说这一个没有工作之前,你编辑你的评论),你应该表明接受这个答案,因为这将有助于未来寻找同样问题的人们。你应该为此使用的每个问题的左侧都有一个复选标记。 – Nailuj 2011-01-10 15:12:52

只是说从我个人的经验,在选择错误的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应该工作。