有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java处理与改型不一致的API响应

我在新项目中面临一个问题。我正在连接一个API,它可以根据一些服务器逻辑在一个响应中响应两种不同的数据类型。我在Android上使用改型,我想知道在改型对象解析之前是否有一些“简单”的方法来处理这种情况,例如,某种解析器/序列化程序,可以检查什么类型有特定的JSON字段?我不知道

以下是可能的答复:

错误响应:

{
  "ReturnCode": "error",
  "ReturnCodeNumber": 444,
  "ReturnMessage": "Invalid Request",
  "ReturnData": ""
}

数据响应:

{
  "ReturnCode": "ok",
  "ReturnCodeNumber": 0,
  "ReturnMessage": "success",
  "ReturnData": [
    {

    }
  ]
}

改装API请求:

@FormUrlEncoded
@POST("url")
Observable<ApiResponse<List<Data>>> requestData()

API响应类公开了上述响应的字段,并为returnData参数化了T

那么,是否有可能以某种方式将其包装到某个序列化程序类中


共 (2) 个答案

  1. # 2 楼答案

    尝试使用TypeAdapterFactory来执行此操作。该类的示例如下所示

    public class ItemTypeAdapterFactory implements TypeAdapterFactory {
        @Override
        public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> type) {
            final TypeAdapter<T> delegate = gson.getDelegateAdapter(this, type);
            final TypeAdapter<JsonElement> elementAdapter = gson.getAdapter(JsonElement.class);
    
            return new TypeAdapter<T>() {
                public void write(JsonWriter out, T value) throws IOException {
                    delegate.write(out, value);
                }
    
                public T read(JsonReader in) throws IOException {
                    JsonElement jsonElement = elementAdapter.read(in);
                    if (jsonElement.isJsonObject()) {
                        JsonObject jsonObject = jsonElement.getAsJsonObject();
                        if (jsonObject.has("data") && jsonObject.get("data").isJsonObject()) {
                            jsonElement = jsonObject.get("data");
                        }
                    }
                    return delegate.fromJsonTree(jsonElement);
                }
            }.nullSafe();
        }
    }
    

    这个Gson进入了RestaAdapter

    final Gson gson = new GsonBuilder().registerTypeAdapterFactory(new ItemTypeAdapterFactory()).create();
    final Client client = new OkClient(new OkHttpClient());
    final RestAdapter restAdapter = new RestAdapter.Builder().setClient(client).setLogLevel(RestAdapter.LogLevel.FULL).setConverter(new GsonConverter(gson)).setEndpoint(context.getString(R.string.base_url)).build();