解析JSON与可变键的改造

问题描述:

我正在与改造库的应用程序,但我不负责后端。解析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

我找到了一个解决方案。您可以在改造这样的注册类型的适配器:

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

只是要响应等级是这样的:

public class EmailReponse{ 

    public String status; 
    public MError errors; 

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

} 

这种反应,你可以得到电子邮件的对象像一个HashMap。 希望这能帮到你!