使用 Retrofit 和 Gson 解析带有未知键的 JSON 字符串时遇到问题

Trouble parsing a JSON string with unknown keys using Retrofit and Gson

我有一个 JSON 响应,其中包含未知键(数字),我发现使用 Gson 转换器很难解析这些键。精简版为

{
  "list": {
    "14": {
      "nickname": "Dave",
      "fullname": "David Collins"
    },
    "68": {
      "nickname": "Phil",
      "fullname": "Phillip Jordan"
    }
  },
  "action": "load",
  "status": "LOADED"
}

下面的class结构给出错误Expected BEGIN_OBJECT but was NUMBER at line 1 column 23 path $.list..

data class NameNW(
    val fullname: String,
    val nickname: String
)

data class NamesListNWEntity(
    val action: String,
    val list: Map<Int, Map<String, NameNW>>,
    val status: String
)

我不确定为什么它在类型为 Map

我的改装代码是

interface Network  {

    @FormUrlEncoded
    @POST("serverfile")
    suspend fun getNames(
        @Field("action") action: String,
    ): NamesListNWEntity
}

class RetrofitWithCookie @Inject constructor(
    context: Context,
    gson: Gson
) {
    private val mContext = context
    private val gson = gson

    fun createRetrofit(): Retrofit {
        val client: OkHttpClient
        val builder = OkHttpClient.Builder()
        builder.addInterceptor(AddCookiesInterceptor(mContext))
        builder.addInterceptor(ReceivedCookiesInterceptor(mContext))
        client = builder.build()

        return Retrofit.Builder()
            .baseUrl("http://192.168.0.19/")
            .client(client)
            .addConverterFactory(GsonConverterFactory.create(gson))
            .build()
    }
}

我用 val namesListNWEntity = Network.getNames("load")

尝试使用以下代码。

data class NameNW(
    val fullname: String,
    val nickname: String
)

data class NamesListNWEntity(
    val action: String,
    val list: Map<String, NameNW>,
    val status: String
)

// You can also test with static json string
private fun test() {
    val apiResponse = "{\n" +
            "  \"list\": {\n" +
            "    \"14\": {\n" +
            "      \"nickname\": \"Dave\",\n" +
            "      \"fullname\": \"David Collins\"\n" +
            "    },\n" +
            "    \"68\": {\n" +
            "      \"nickname\": \"Phil\",\n" +
            "      \"fullname\": \"Phillip Jordan\"\n" +
            "    }\n" +
            "  },\n" +
            "  \"action\": \"load\",\n" +
            "  \"status\": \"LOADED\"\n" +
            "}"

    val namesListNWEntity: NamesListNWEntity = Gson().fromJson(apiResponse, NamesListNWEntity::class.java)
}