使用RetroFit for Android解析嵌套的JSON

时间:2015-02-07 06:55:04

标签: java android json rest retrofit

我使用RetroFit与我的API进行通信。响应是JSON,其中一个JSON对象(' user')是一个字符串。我想将该字符串解析为JSON。

我有一个响应课:

public class TokenModel {
   @SerializedName("access_token")
   private String accessToken;

   @SerializedName(".expires")
   private String expiryDate;

   private UserModel user;


   public String getAccessToken() {
       return accessToken;
   }

   public void setAccessToken(String accessToken) {
       this.accessToken = accessToken;
   }

   public String getExpiryDate() {
       return expiryDate;
   }

   public void setExpiryDate(String expiryDate) {
       this.expiryDate = expiryDate;
   }

   public UserModel getUser() {
       return user;
   }

   public void setUser(UserModel user) {
       this.user = user;
   }
}

和用户的类:

public class UserModel {
   private int id;

   private String email;

   private String firstName;

   private String lastName;

   private String profileImageUrl; etc...

但是,因为'用户'响应中的对象是一个需要首先解析为JSON的字符串。我不确定如何做到这一点,仍然可以使用该模型。有没有办法告诉RetroFit在将它应用到模型之前首先将其解析为JSON?

谢谢你, 丹尼尔

1 个答案:

答案 0 :(得分:1)

使用@ corsair992的建议,结果非常简单。

创建自定义反序列化器以将字符串解析为Json:

public class UserDeserializer implements JsonDeserializer<UserModel> {
    @Override
    public UserModel deserialize(JsonElement jsonElement, Type typeOF,
                                 JsonDeserializationContext context)
            throws JsonParseException {
        String userString = jsonElement.getAsString();
        JsonElement userJson = new JsonParser().parse(userString);

        return new Gson().fromJson(userJson, UserModel.class);
    }
}

然后将其设置为其余适配器上的转换器:

RestAdapter restAdapter = new RestAdapter.Builder()
                .setLogLevel(RestAdapter.LogLevel.FULL)
                .setConverter(new GsonConverter(new GsonBuilder().registerTypeAdapter(UserModel.class, new UserDeserializer()).create()))
                .setEndpoint(getString(R.string.url_base))
                .build();

现在将把字符串转换为Json并使其与模型一起运行。