2015-04-21 47 views
0

我在项目中使用retrofit和gson。 答案来自于服务器的格式用gson改造。如何解析响应?

{ 
    1:"user1", 
    2: "user2" 
} 

我有结构的POJO

public class User { 

@Expose 
@Getter 
@Setter 
private int uid; 
@Expose 
@Getter 
@Setter 
private String nick;} 

,并要求改造

@Get("/") 
User getPojousers(); 

但在回答动态密钥。我如何描述这个类的响应?

+0

对于初学者来说,这将是一个'名单',不能简单地认为是返回 – njzk2

+0

然后你需要为'名单' – njzk2

+0

@ njzk2'名单一个TypeAdapter了''User'?我不这么认为。 Json是JsonObject而不是数组。 – skywall

回答

0

这是一个自定义适配器,它将返回该对象的用户列表。 (您可能需要修复的JSON所以它是有效的,第一)

@Override 
public List<User> deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { 
    List<User> result = new ArrayList<>(); 

    for (Map.Entry<String, JsonElement> elem : json.getAsJsonObject().entrySet()) { 
     result.add(new User(Integer.parseInt(elem.getKey()), elem.getValue())); 
    } 
    return result; 
} 

User类需要一个构造函数与2个PARAMS,当然。

+0

thx,它的工作! – aleksey080

+0

你可以发布一部分代码,其中TypeAdapter是注册的,而类的定义在哪里,这个方法属于哪里? – skywall

+0

这部分代码是我从你的答案中拿出来的。你的答案也很有帮助。 – aleksey080

0

你必须分析你自己的(例如与SparseArrayUsers类:

public static class Users implements JsonDeserializer<User> { 
    public SparseArray<String> values = new SparseArray<>(); 

    @Override 
    public Users deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { 
     Users u = new Users(); 
     if (json.isJsonObject()) { 
      JsonObject obj = (JsonObject) json; 

      for (Map.Entry<String, JsonElement> elem : obj.entrySet()) { 
       if (Util.isInteger(elem.getKey())) { 
        u.values.put(Integer.parseInt(elem.getKey()), elem.getValue().getAsString()); 
       } 
      } 
     } 
     return u; 
    } 
} 

为了使这项工作增加TypeAdapter到Gson例如:

private static GsonConverter getConverter() { 
    GsonBuilder builder = new GsonBuilder(); 
    builder.registerTypeAdapter(Users.class, new Users()); 

    return new GsonConverter(builder.create()); 
} 

而且在RestAdapter情况下使用此转换器:

mInstance = new RestAdapter 
       .Builder() 
       .setConverter(getConverter()) 
       .// 
       .create(...)