Rest 用于API和消费的超薄框架,并进行了改装

Rest 用于API和消费的超薄框架,并进行了改装,rest,retrofit,slim,retrofit2,Rest,Retrofit,Slim,Retrofit2,我尝试用slim框架返回“问题”列表,并在我的android应用程序中使用这些问题 $app->get('/questions', function() use ($app, $bdd, $logger) { $stmt = $bdd->prepare('SELECT * FROM questions'); $stmt->execute(); $questions = $stmt->fetchAll(PDO::FETCH_ASSOC);

我尝试用slim框架返回“问题”列表,并在我的android应用程序中使用这些问题

$app->get('/questions', function() use ($app, $bdd, $logger) {

    $stmt = $bdd->prepare('SELECT * FROM questions');
    $stmt->execute();
    $questions = $stmt->fetchAll(PDO::FETCH_ASSOC);
    $app->render(200, $questions);

});
给予

在我的改装api服务中:

@GET("questions")
Call<ArrayList<Question>> getQuestions();
@GET(“问题”)
调用getQuestions();
并致电:

APIService api = getRetrofit().create(APIService.class);
Call<ArrayList<Question>> call = api.getQuestions();

call.enqueue(new Callback<ArrayList<Question>>() {
    @Override
    public void onResponse(Response<ArrayList<Question>> response, Retrofit retrofit) {
        questions.addAll(response.body());
    }

    @Override
    public void onFailure(Throwable t) {
        Log.d("QFragment", "loadData error" + t.getMessage());
    }
});
APIService api=getRefundation().create(APIService.class);
Call=api.getQuestions();
call.enqueue(新回调(){
@凌驾
公共响应(响应、改装){
questions.addAll(response.body());
}
@凌驾
失效时的公共无效(可丢弃的t){
Log.d(“QFragment”、“loadData错误”+t.getMessage());
}
});
但不正确,因为api给了我对象列表,在我的应用程序中,我需要一个数组: java.lang.IllegalStateException:应为BEGIN\u数组,但在第1行第2列路径$处为BEGIN\u对象。

要帮忙吗


结果

好的,有了Jackub answer,我解决了我的问题,只需将registerTypeAdapterFactory添加到我的GsonBuilder()中,即可获得如下所示的有效负载:

public class ItemTypeAdapterFactory implements TypeAdapterFactory {

  public <T> TypeAdapter<T> create(Gson gson, final 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("payload")) {
                    jsonElement = jsonObject.get("payload");
                }
            }

            return delegate.fromJsonTree(jsonElement);
        }
    }.nullSafe();
  }
}
公共类ItemTypeAdapterFactory实现TypeAdapterFactory{
公共类型适配器创建(Gson Gson,最终类型令牌类型){
final-TypeAdapter-delegate=gson.getDelegateAdapter(这个,类型);
final-TypeAdapter-elementAdapter=gson.getAdapter(JsonElement.class);
返回新的TypeAdapter(){
public void write(JsonWriter out,T值)抛出IOException{
委托。写出(输出、值);
}
公共T读取(JsonReader in)引发IOException{
JsonElement JsonElement=elementAdapter.read(in);
if(jsonElement.isJsonObject()){
JsonObject=jsonElement.getAsJsonObject();
if(jsonObject.has(“有效负载”)){
jsonElement=jsonObject.get(“有效负载”);
}
}
从JSONTREE(jsonElement)返回委托;
}
}.nullSafe();
}
}

这是因为存在键
error
status
,所以数组索引被转换为键

你可以这样做

$payload = ['payload' => $questuons];

$app->render(200, $payload);
并在android应用程序中调整您对响应的使用

$payload = ['payload' => $questuons];

$app->render(200, $payload);