【问题标题】:pojo parse gson with invalid java namespojo 使用无效的 java 名称解析 gson
【发布时间】:2011-01-10 13:15:01
【问题描述】:

我正在使用来自 google-api-client 的 youtube json:

{
    "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 类中创建一个名为 default 的字段名。 已经用其他字段完成了这个解析工作,问题是,默认是 一个私有的 java 名字,所以我不能调用一个变量 default 。

我该如何管理?

【问题讨论】:

    标签: java android json


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      如果您对映射字段使用@Key 注释,则只需使用可以传递给此注释的自定义值。因此,为您的字段选择一个合法名称并将其映射为@Key("default"):

      @Key("default")
      private String defaultUrl;
      

      【讨论】:

      • @user569873:如果“第一个”解决方案有效(我假设您的意思是我的,因为您在编辑评论之前说过这个解决方案不起作用),您应该通过接受该答案来表明,因为这将有助于人们在未来寻找同样的问题。您应该为此使用的每个问题的左侧都有一个复选标记。
      • @user569873:给你第二个提示:你应该不编辑你的第一条评论,这样人们就会明白为什么这个具体的建议对你不起作用,因为人们可以学到一些东西从中也很有用:)
      【解决方案3】:

      就我个人的经验来说吧,@Key 在选择错误的 Json 解析器时可能无法进行序列化/反序列化。

      (1) 当你使用 Gson 解析器时,如下所示:

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

      @Key 不起作用,你应该使用@SerializedName 来注释字段名称。

      (2) 当您使用 com.google.api.client.json 包中的 JsonFactory 时,如下所示:

       JacksonFactory jsonFactory=new JacksonFactory();
      

      @Key 应该可以工作。

      【讨论】:

        猜你喜欢
        • 2011-04-26
        • 1970-01-01
        • 2013-02-02
        • 2018-04-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-26
        相关资源
        最近更新 更多