使用 RetroFit 解析嵌套 JSON Android

Parsing nested JSON using RetroFit for Android

我正在使用 RetroFit 与 API 进行通信。响应是 JSON 并且 JSON 对象之一 ('user') 是一个字符串。我想将该字符串解析为 JSON.

我有一个 class 的回复:

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;
   }
}

和 class 用户:

public class UserModel {
   private int id;

   private String email;

   private String firstName;

   private String lastName;

   private String profileImageUrl; etc...

但是,由于响应中的 'user' 对象是一个字符串,因此需要首先将其解析为 JSON。我不确定如何做到这一点,并仍然让它与模型一起工作。有没有办法告诉 RetroFit 在将其应用到模型之前首先将其解析为 JSON?

谢谢, 丹尼尔

事实证明使用@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 并使其与模型一起运行。