【问题标题】:Serializing JSON string to object将 JSON 字符串序列化为对象
【发布时间】:2012-07-08 09:10:46
【问题描述】:

我正在尝试解析一个 JSON 字符串并将其转换为以下 POJO:

package apicall;
//POJO representation of OAuthAccessToken
public class OAuthAccessToken {
    private String tokenType;
    private String tokenValue;
    public OAuthAccessToken(String tokenType,String tokenValue) {
        this.tokenType=tokenType;
        this.tokenValue=tokenValue;
    }

    public String toString() {
        return "tokenType="+tokenType+"\ntokenValue="+tokenValue;

    }

    public String getTokenValue() {
        return tokenValue;
    }

    public String getTokenType() {
        return tokenType;
    }

}

为了做到这一点,我编写了以下代码:

Gson gson=new Gson();
String responseJSONString="{\"access_token\" : \"2YotnFZFEjr1zCsicMWpAA\",\"token_type\" : \"bearer\"}";
OAuthAccessToken token=gson.fromJson(responseJSONString, OAuthAccessToken.class);
System.out.println(token);

当我运行代码时,我得到以下输出:

tokenType=null
tokenValue=null

Instead of 
tokenType=bearer
tokenValue=2YotnFZFEjr1zCsicMWpAA

我不明白我是否做错了什么。请帮忙。

【问题讨论】:

    标签: java json gson pojo


    【解决方案1】:

    您可以通过注释您的字段来获得预期的结果:

    @SerializedName("token_type")
    private final String tokenType;
    @SerializedName("access_token")
    private final String tokenValue;
    

    【讨论】:

      【解决方案2】:

      Gson 应该如何知道如何填充您的对象?您没有无参数构造函数,并且对象的字段与 JSON 对象中的字段不匹配。

      使你的对象如下:

      public class OAuthAccessToken {
          private String accessToken;
          private String tokenType;
      
          OAuthAccessToken() {
          }
      
          ...
      }
      

      【讨论】:

      • 这不是问题,实际上Gson并不要求你有一个空参数的构造函数,当对象被恢复时没有构造函数被执行。
      • 文档不是这么说的:在反序列化对象时,Gson 需要创建类的默认实例 用于序列化和反序列化的行为良好的类应该没有参数构造函数。不管是公开的还是私人的。通常,当您处理未定义无参数构造函数的库类时,需要 Instance Creators。 请参阅sites.google.com/site/gson/… 无论如何,要点是 JSON 和 Java 字段根本不匹配。
      【解决方案3】:

      该类应该具有与 json 完全相同的字段名称,因此如果您的 json 有 2 个键:“access_token”和“token_type”,则该类应该有 2 个字段:

      private String access_token;
      private String token_type;
      

      当然,您需要相应地更改 getter/setter。

      【讨论】:

        猜你喜欢
        • 2011-12-31
        • 2019-02-09
        • 1970-01-01
        • 2014-01-04
        • 2020-02-03
        • 1970-01-01
        • 2012-04-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多