web-dev-qa-db-ja.com

SerializedNameアノテーションがMoshiで機能していないようです

そのため、Moshiを使用してサーバーからの呼び出しを解析しようとしています。これは私の応答オブジェクトです。

public class TokenResponse {
    @SerializedName("accessToken")
    public String accessToken;
    public String token_type;
    public int expires_in;
    public String userName;
    public String name;
    @SerializedName(".issued")
    public String issued;
    @SerializedName(".expires")
    public String expires;
    public String Roles;

}

これは私のエンドポイントの定義です(それほど重要ではありませんが、とにかく含めます)

public interface ServerService {

        @POST("/token")
        @FormUrlEncoded
        Call<TokenResponse> getToken(@Field("username") String username,
                                    @Field("password") String password, @Field("grant_type") String grant_type);

    }

そして、これは私が呼び出すために使用しているコードです。

Retrofit retrofit = new Retrofit.Builder()
                .baseUrl("https://xxx/")
                .addConverterFactory(MoshiConverterFactory.create())
                .build();

        ServerService service = retrofit.create(ServerService.class);

        Call<TokenResponse> call = service.getToken("[email protected]", "password1!", "password");

        call.enqueue(new Callback<TokenResponse>() {
            @Override
            public void onResponse(Call<TokenResponse> call, Response<TokenResponse> response) {
                if (response.isSuccessful()) {
                    // tasks available
                    TextView tv = (TextView)findViewById(R.id.tvToken);
                    tv.setText(response.body().accessToken);


                } else {
                    // error response, no access to resource?
                }
            }
        });

OnResponseメソッドでは、response.body()には常にaccessTokenがあり、発行され、nullとして期限切れになります。他のパラメータの値を取得します。 Android Profilerを使用すると、これが応答として返されることは確かです。

{  
   "access_token":"_xxx",
   "token_type":"bearer",
   "expires_in":1209599,
   "userName":"xxx",
   "name":"LOURDES RILEY",
   ".issued":"Tue, 19 Dec 2017 23:37:06 GMT",
   ".expires":"Tue, 02 Jan 2018 23:37:06 GMT",
   "Roles":"[\"Admin\"]"
}

だから私は何が間違っているのですか? SerializedNameが機能しないのはなぜですか?

15
Diskdrive

@SerializedName("accessToken")はGsonです

そのはず

@Json(name="access_token")

28
Diskdrive