使用Gson / Retrofit解析具有非命名值的数组

时间:2015-09-08 15:10:56

标签: android gson retrofit

我收到服务器的回复,其数组包含没有名称的值,只有[tag:tag, tag:tag]

等值

以下是工作示例:

 "result": {
        "vendors": {
            "type": "growing",
            "queryString": "fruits[]",
            "values": {
                "1": "Apple",
                "2": "Pear",
                "3": "Mango",
                "4": "Pineapple",
.....

我如何解析POJO的这个答案?我理解将数组包装到{id:1,name:apple}中很简单,但如果没有它我怎么能用它来管理呢?

1 个答案:

答案 0 :(得分:1)

1)如果您可以让服务器更改该序列化格式,请让他们这样做。这很粗略。

2)如果您无法更改服务器格式,则可以实现自定义TypeAdapter。这是一个自定义适配器,只读取值,丢弃名称/索引,并添加到列表中。

public class VerboseArrayTypeAdapter extends TypeAdapter<List<String>> {

    @Override
    public void write(JsonWriter out, List<String> value) throws IOException {
        // Hopefully you don't need to serialize in this format, too!
    }

    @Override
    public List<String> read(JsonReader in) throws IOException {
        List<String> elements = new ArrayList<String>();
        in.beginObject();
        while (in.peek() != JsonToken.END_OBJECT) {
            in.nextName();
            elements.add(in.nextString());
        }
        in.endObject();
        return elements;
    }
}

如下所示注释您的供应商类(注意,我没有显示您拥有的包装类) -

public class Vendors {
    String type;
    String queryString;
    @JsonAdapter(VerboseArrayTypeAdapter.class)
    List<String> values;
}

注意这里有几点需要注意 - 我们忽略了JSON中的索引。因此要么a)你需要确保服务器总是按顺序序列化元素,或者b)你不关心订单。

3)见第1点。