Retrofit / GSON:如何处理两种类型的响应:JSON对象和JSON数组?

时间:2017-09-08 02:01:53

标签: gson retrofit

我的服务器团队定义了一个可怕的响应,它可能是像{key1=value1, key2=value2}这样的json对象,可能是像[{key3=value3, key4=value4}, {key3=value3a, key4=value4a}]这样的json数组。

这两种类型具有如下逻辑关系:对于单个API,服务器将:

  • 如果出现错误或
  • ,则发送JSON对象
  • 如果有有效数据,则发送JSON数组。

我不能告诉他们改变这个,因为这个响应被PC和iOS等其他目的使用。

那么我应该怎么做这个四个字母的字响应呢?我使用网络改造和GSON进行响应反序列化。

1 个答案:

答案 0 :(得分:1)

static class Entity {
    String name;
    // other fields
}

static class Error {
    String errorName;
    // other fields
}

public static void main(String[] args) throws Exception {
    // no error
    String jsonString = "[{'name': 'one'}, {'name': 'two'}]";
    // error
    // String jsonString = "{'errorName': 'Not Found'}";

    Gson gson = new Gson();
    JsonElement jsonElement = new JsonParser().parse(jsonString);
    if (jsonElement.isJsonArray()) {
        // no error
        Entity[] entities = gson.fromJson(jsonElement, Entity[].class);
        System.out.println(entities[0].name);
    } else if (jsonElement.isJsonObject()) {
        // error
        Error error = gson.fromJson(jsonElement, Error.class);
        System.out.println(error.errorName);
    } else {
        throw new IOException("Server response is not jsonElement array or jsonElement object");
    }
}