用 gson 改造。如何解析响应?

Retrofit with gson. How parse response?

我在项目中使用改造和 gson。 答案来自服务器,格式为

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

我有结构 pojo

public class User {

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

并请求改造

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

但是响应动态键。如何描述 class 的响应?

您必须自己解析 Users class(例如 SparseArray):

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(...)

这是一个自定义适配器,它将 return 该对象的用户列表。 (您可能需要首先修复 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 class 需要一个带有这 2 个参数的构造函数。