当前位置: 首页 > 知识库问答 >
问题:

在对象中转换Gson数组

孔瑾瑜
2023-03-14

我正试图从这个服务器响应中提取“级别”。我对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)
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 
 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)

共有1个答案

鄢晔
2023-03-14

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

JsonArray array = je.getAsJsonObject().getAsJsonArray(key);
 类似资料:
  • 问题内容: 目前,我正在使用带有webView前端的本机android应用程序。 我有类似的东西: 在活动中 我做了一个dataObject数组,比如dataObject x [5]; 现在,我想将这5个dataObject作为JSON的回调函数传递给我的javascript webView接口。 我浏览了互联网,似乎大多数教程都在谈论如何转换。没有太多关于。我找到了一个教会我的人,可以工作。 但

  • 我想将以下字符串作为json发布到服务器。 {“FirstName”:“John”,“LastName”:“Smith”},{“FirstName”:“John”,“LastName”:“Smith”} 但是如果我使用下面的代码,我会得到json对象的数组列表。 输出: [{"FirstName":"John","LastName":"Smith" }, { "FirstName":"John",

  • 我使用的是名为Gson的Google JSON API,在设置Java类以便使用方法时遇到了困难。 从JSON数据中,我知道有一个包含所有数据的对象数组。让我感到困惑的是外部标记。我知道我必须构造一个表示对象的类,但是我是否也必须创建一个表示的类,因为它包含? 目前,我有一个名为的文件,其中包含以下内容: 我只包括了我计划使用的变量。上面的JSON数据包含在一个名为的字符串中,这就是我在main方

  • 我正在使用GoogleGSON2.4版本,我已经将文件gson-2.4.jar添加到我的Android项目中的Android studio中的libs文件夹下。代码生成成功。 我的代码如下 json始终为空值。 我的预期结果为 我该怎么修好它?谢谢

  • 问题内容: 我正在尝试使用GSON将JSON对象转换为POJO。 JSON字串 与GSON一起使用的AutomationProjectsList类 自动化项目POJO 我正在使用的代码 JSONArray jsonArray =新的JSONArray(response.getEntity(String.class)); 但是它给出了一个例外: 为什么会收到IndexOutOfBoundsExcep

  • 问题内容: 我有一个对象数组: 如何通过JavaScript将其转换为以下内容? 问题答案: 您可能正在寻找这样的东西: