【问题标题】:Retrofit with gson. How parse response?用 gson 改造。如何解析响应?
【发布时间】:2015-04-21 09:00:06
【问题描述】:

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

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

我有结构 pojo

public class User {

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

并要求改造

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

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

【问题讨论】:

  • 对于初学者来说,这将是一个List<User>,而不仅仅是一个返回的User
  • 那么你需要一个用于List<User>的TypeAdapter
  • @njzk2 List<User>?我不这么认为。那个 Json 是 JsonObject 而不是数组。
  • @skywall: 对,但是你可以看到该对象包含多个 uid,每个都链接到一个 nick。每个键值代表一个不同的用户,因此可以将其视为一个列表。 (当然,通过自定义适配器)。在其他语言中,这将被称为关联 array
  • @njzk2 当然,多个 id 与用户列表具有相似的含义。我只是不同意您的意见,即他需要 List<User> 而不是 User 的 TypeAdapter。我认为这令人困惑。他肯定需要 User 的 TypeAdapter,但反序列化方法可能会返回用户列表。

标签: android gson retrofit


【解决方案1】:

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

【讨论】:

  • 你能贴出部分代码,TypeAdapter 注册的地方和类的定义,这个方法所属的地方吗?
  • 这部分代码是我从你的回答中得到的。您的回答也很有帮助。
【解决方案2】:

您必须自己解析Users 类(以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(...)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-27
    • 2021-01-22
    • 1970-01-01
    相关资源
    最近更新 更多