Java 将JSON字符串序列化为对象

Java 将JSON字符串序列化为对象,java,json,gson,pojo,Java,Json,Gson,Pojo,我试图通过JSON字符串进行解析,并将其转换为以下POJO: package apicall; //POJO representation of OAuthAccessToken public class OAuthAccessToken { private String tokenType; private String tokenValue; public OAuthAccessToken(String tokenType,String tokenValue) {

我试图通过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

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

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

按如下方式制作对象:

public class OAuthAccessToken {
    private String accessToken;
    private String tokenType;

    OAuthAccessToken() {
    }

    ...
}

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

按如下方式制作对象:

public class OAuthAccessToken {
    private String accessToken;
    private String tokenType;

    OAuthAccessToken() {
    }

    ...
}

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

private String access_token;
private String token_type;

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

该类应该具有与json相同的字段名,因此如果您的json有两个键:“access\u token”和“token\u type”,则该类应该有两个字段:

private String access_token;
private String token_type;

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

您可以通过如下方式注释字段来获得预期结果:

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

通过对字段进行如下注释,可以获得预期结果:

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

这不是问题所在,事实上Gson不要求您有一个空参数构造函数,当还原对象时,不执行任何构造函数。这不是documantations所说的:当反序列化对象时,Gson需要创建类的默认实例,用于序列化和反序列化的行为良好的类应该具有无参数构造函数。不管是公共的还是私人的。通常,在处理未定义无参数构造函数的库类时,需要实例创建者。不管怎么说,主要的一点是JSON和Java字段根本不匹配。这不是问题所在,事实上Gson不要求你有一个空参数构造函数,当对象被还原时,没有构造函数被执行。这不是documantations所说的:当反序列化一个对象时,Gson需要创建类的默认实例,用于序列化和反序列化的行为良好的类应该具有无参数构造函数。不管是公共的还是私人的。通常,在处理未定义无参数构造函数的库类时,需要实例创建者。不管怎么说,要点是JSON和Java字段根本不匹配。