在改造中使用变量键解析JSON

时间:2014-10-09 07:51:10

标签: android json retrofit

我正在使用改造库来处理应用程序,但我不负责后端。

这是我收到错误时收到的JSON。 例如,当参数' email'是错的我把它作为JSON响应:

{"status":"error","errors":{"email":{"emailNotFound":"Email not found"}}}

现在发送电子邮件' part是错误的参数。如何为此创建一个可以重用多个参数的对象。

我有这个:

public class AuthenticateResponse {

@Expose
private String status;
@Expose
private Error errors;
@Expose
private String session;

public String getStatus() {
    return status;
}

public void setStatus(String status) {
    this.status = status;
}

public String getSession() {
    return session;
}

public void setSession(String session) {
    this.session = session;
}

public Error getErrors() {
    return errors;
}

public void setErrors(Error errors) {
    this.errors = errors;
}
}

但我不知道如何制作我的Error对象,因为该键是可变的。在这种情况下,它的电子邮件是'但它总是不同的。

我有这个

public class Errors {
private List<Object> list;

public List<Object> getList() {
    return list;
}

public void setList(List<Object> list) {
    this.list = list;
}
}

但是&#39; list&#39;不是json中的关键所以这不起作用。
有解决方案吗

2 个答案:

答案 0 :(得分:2)

我找到了解决方案。您可以在改装中注册类型适配器,如下所示:

Gson gson = new GsonBuilder()
                .registerTypeAdapter(Errors.class, new ErrorAdapter())
                .create();

将该转换器传递给RestAdapter

RestAdapter restAdapter = new RestAdapter.Builder()
                .setEndpoint(ENDPOINT)
                .setRequestInterceptor(requestInterceptor)
                .setConverter(new GsonConverter(gson))
                .build();

在ErrorAdapter中,我手动解析JSON

public static class ErrorAdapter implements JsonDeserializer<Errors> {
    @Override
    public Errors deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
        Errors errors = new Errors();

        try {
            if (json != null) {
                JsonObject jsonObject = json.getAsJsonObject();

                for (Map.Entry<String, JsonElement> elementJson : jsonObject.entrySet()) {
                    JsonObject error = elementJson.getValue().getAsJsonObject();
                    String errorValue = error.entrySet().iterator().next().getKey();

                    errors.addError(errorValue);
                }
            }
        } catch (Exception e) {
            errors = null;
        }
        return errors;
    }
}

答案 1 :(得分:0)

只需制作这样的响应类:

public class EmailReponse{

    public String status;
    public MError errors;

    public static class MError{
          public HashMap<String, String> email;
    }

 }

通过此响应,您可以获得HashMap等电子邮件对象。 希望对你有所帮助!