【问题标题】:Convert a Gson Array within an Object在对象中转换 Gson 数组
【发布时间】:2018-12-06 23:57:45
【问题描述】:

我正在尝试从该服务器响应中提取“级别”。我对 Android 开发有点陌生。我需要帮助将此 API 响应解析为 POJO 列表。

    {
  "levels": [
    {
      "id": 1,
      "level": 0,
      "name": "Level 0"
    },
    {
      "id": 2,
      "level": 1,
      "name": "Level 1"
    }
  ]
}

关卡的 kotlin 数据类:

data class Level(var id:Int, var level: Int, var name: String?=null)

这是一个自定义的 Gson 反序列化器 JsonDeserializer:

public class RestDeserializer<T> implements JsonDeserializer<T> {
    private Class<T> clasz;
    private String key;

    public RestDeserializer(Class<T> clasz, String key) {
        this.clasz = clasz;
        this.key = key;
    }

    @Override
    public T deserialize(
            JsonElement jsonElement,
            Type type,
            JsonDeserializationContext jsonDeserializationContext
    ) throws JsonParseException{
        JsonElement content = jsonElement.getAsJsonObject().get(key);
        return new Gson().fromJson(content, clasz);
    }
}

改造客户端:

interface LevelService {
    @GET("api/levels")
    fun getLevels():Call<List<Level>>

    companion object {
        fun levels(context: Context): LevelService{
            Gson gson = new GsonBuilder()
                .registerTypeAdapter(Level.class, new RestDeserializer<>(Level[].class, "levels"))
                .create();
val retrofit = Retrofit.Builder()
                .addConverterFactory(GsonConverterFactory.create(gson))
                .baseUrl(Constants.BASE_URL)
                .client(httpClient.build())
                .build();
            return retrofit.create(LevelService::class.java)
        }
    }
}

最后调用:

fun getLevels(){
        val apiService = LevelService.levels(applicationContext)
        apiService.getLevels().enqueue(object : Callback<List<Level>>{
            override fun onFailure(call: Call<List<Level>>?, t: Throwable?) {
                Log.d("Error: FATAL)", "Error:(")
                t!!.printStackTrace()
            }

            override fun onResponse(call: Call<List<Level>>?, response: Response<List<Level>>?) {
                if (response!!.isSuccessful){

                    Log.d("SUCCESS", response.body().toString())
                }
                else{
                    Log.d("Error:)", response.errorBody().toString())
                }
            }

        })
    }

但它没有给出错误我希望它清楚:

java.lang.IllegalStateException: Expected BEGIN_ARRAY but was BEGIN_OBJECT at line 1 column 2 

非常感谢任何帮助!

StakeTrace 如下:

 W/System.err: java.lang.IllegalStateException: Expected BEGIN_ARRAY but was BEGIN_OBJECT at line 1 column 2 path $
        at com.google.gson.stream.JsonReader.beginArray(JsonReader.java:350)
        at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:80)
        at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:61)
        at retrofit2.converter.gson.GsonResponseBodyConverter.convert(GsonResponseBodyConverter.java:39)
W/System.err:     at retrofit2.converter.gson.GsonResponseBodyConverter.convert(GsonResponseBodyConverter.java:27)
        at retrofit2.ServiceMethod.toResponse(ServiceMethod.java:122)
        at retrofit2.OkHttpCall.parseResponse(OkHttpCall.java:217)
        at retrofit2.OkHttpCall$1.onResponse(OkHttpCall.java:116)
        at okhttp3.RealCall$AsyncCall.execute(RealCall.java:153)
        at okhttp3.internal.NamedRunnable.run(NamedRunnable.java:32)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
        at java.lang.Thread.run(Thread.java:818)

【问题讨论】:

  • 你能发布 logcat 的完整堆栈跟踪吗?您发布的错误没有提供足够的信息,例如出错的代码行。还要指出堆栈跟踪表明错误在哪一行。
  • 我刚刚添加了跟踪,希望它提供信息

标签: java gson retrofit android


【解决方案1】:

您必须更改 RestDeserializer 以从 JsonArray 而不是直接从 JsonObject 获取值。

JsonArray array = je.getAsJsonObject().getAsJsonArray(key);

【讨论】:

  • 不知道哪里漏掉了,我刚改了但是还是有错误!!
  • 需要迭代JsonArray并转换为Gson对象
猜你喜欢
  • 1970-01-01
  • 2016-05-07
  • 2014-11-07
  • 2012-02-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-07
  • 2023-03-08
相关资源
最近更新 更多