【问题标题】:How to parse Dynamic lists with Gson annotations?如何使用 Gson 注释解析动态列表?
【发布时间】:2014-11-11 23:00:09
【问题描述】:

我正在使用 Retrofit 和 Gson 来查询 API,但是我从未遇到过这样的 JSON 响应。

回应:

{
    Response: {
        "Black":[
            {"id":"123","code":"RX766"},
            {"id":"324","code":"RT344"}],
        "Green":[
            {"id":"3532","code":"RT983"},
            {"id":"242","code":"RL982"}],
        "Blue":[
            {"id":"453","code":"RY676"},
            {"id":"134","code":"R67HJH"}]
    }
}

问题是列表元素 id 例如“黑色”是动态的,所以我不知道它们会是什么。

到目前为止,我已经为内部类型创建了一个类;

class Type {
    @SerializedName("id") private String id;
    @SerializedName("code") private String code;
}

有没有可能有以下?

class Response {

    @SerializedName("response")
    List<Type> types;
}

然后将列表ID移动到类型中,这样Type类就变成了;

class Type {
    @SerializedName("id") private String id;
    @SerializedName("code") private String code;
    @SerializedName("$") private String type; //not sure how this would be populated
}

如果不是,那么如何仅使用 Gson 属性对其进行解析?

好的,我刚刚看到了这个问题; How to parse dynamic JSON fields with GSON?

看起来不错,是否可以用响应对象包装通用映射?

【问题讨论】:

    标签: gson retrofit


    【解决方案1】:

    如果键是动态的,则需要地图。

    class Response {
        @SerializedName("response")
        Map<String, List<Type>> types;
    }
    

    反序列化后,您可以将类型强制转换为您的域中更具语义的东西。

    如果这不合适,您将需要注册 TypeAdapterJsonDeserializer 并将类似地图的数据自定义反序列化为简单的 List

    【讨论】:

    • 如此简单!非常感谢:D
    • @Jake 你能帮忙解析一下吗,提到here
    猜你喜欢
    • 1970-01-01
    • 2011-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多