2014-10-09 66 views
0

我正在與改造庫的應用程序,但我不負責後端。解析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; 
} 
} 

但我不知道如何使我的錯誤對象,因爲關鍵是可變的。在這種情況下,它是'電子郵件',但它總是不同。

我有這個

public class Errors { 
private List<Object> list; 

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

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

但「清單」是不是在JSON的關鍵所以這是行不通的。
任何解決方案?

+0

解析JSON與嘗試簡單的hashmap – 2014-10-09 08:00:06

回答

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我手動

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。 希望這能幫到你!