如何使用Gson注释解析动态列表?

问题描述 投票:2回答:1

我正在使用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个回答
4
投票

如果键是动态的,您需要一张地图。

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.