2015-04-21 45 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(...)