【问题标题】:Trouble parsing a JSON string with unknown keys using Retrofit and Gson使用 Retrofit 和 Gson 解析带有未知键的 JSON 字符串时遇到问题
【发布时间】:2021-06-12 23:12:54
【问题描述】:

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

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

下面的类结构报错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")

【问题讨论】:

    标签: android gson retrofit


    【解决方案1】:

    试试下面的代码。

    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)
    }
    

    【讨论】:

    • 完美!它维护着未知的密钥,可以使用for (item in list) id = item.Key
    猜你喜欢
    • 1970-01-01
    • 2016-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-15
    • 1970-01-01
    相关资源
    最近更新 更多