2014-10-09 4 views
0

Я работаю над приложением с модифицированной библиотекой, но я не отвечаю за бэкэнд.Parse JSON с переменным ключом в модификации

Это JSON, который я получаю при возникновении ошибки. Например, если параметр «электронная почта» является неправильным я получаю это как ответ JSON:

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

Теперь «электронная почта» часть является параметром, который является неправильным. Как создать объект для этого, чтобы я мог повторно использовать несколько параметров.

У меня есть это:

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

Но «список» не является ключевым в формате JSON, так это не работает.
Любые решения?

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

Просто сделать класс ответа, как это:

public class EmailReponse{ 

    public String status; 
    public MError errors; 

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

} 

с этим ответом вы можете получить объекты электронной почты, как HashMap. Пожелайте вам помочь!

Смежные вопросы