You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android技术求助:无法将JSON字符串转为JsonArray及Model List

解决JSON数组字符串转List的问题

问题核心

你拿到的字符串是JSON数组的字符串表示(首尾被双引号包裹,内部双引号经过转义),同时之前的Gson转换方式未正确保留泛型类型信息,导致转换失败。

解决步骤

1. 预处理原始字符串

先将原始字符串转换为标准JSON数组格式:去掉首尾双引号,还原内部被转义的双引号。

// 假设原始字符串为s
val rawJson = s.trim().removeSurrounding("\"").replace("\\\"", "\"")

2. 用Gson正确转换为List

由于Kotlin的泛型擦除特性,直接传入mutableListOf<Model>().javaClass会丢失Model的泛型信息,Gson无法正确映射对象。需使用TypeToken明确泛型类型:

import com.google.gson.Gson
import com.google.gson.reflect.TypeToken

// 定义与JSON结构匹配的数据类,特殊键用@SerializedName映射
data class Model(
    @SerializedName("@context") val context: List<String>,
    val id: String,
    val type: List<String>,
    val issuer: String,
    val issuanceDate: String,
    val expirationDate: String,
    val credentialSchema: CredentialSchema,
    val credentialSubject: CredentialSubject,
    val proof: Proof
)

data class CredentialSchema(
    val id: String,
    val type: String
)

// 处理两种不同结构的credentialSubject,可根据实际需求调整为密封类或兼容字段
data class CredentialSubject(
    val contact: String? = null,
    val name: Any? = null, // 可单独定义Name类处理对象类型的name
    val orgId: String? = null,
    val birthDate: String? = null,
    val email: String? = null,
    val gender: String? = null,
    val organization: String? = null,
    // 其他对应字段...
)

data class Name(
    val familyName: String,
    val givenName: String
)

data class Proof(
    val created: String,
    val creator: String,
    val nonce: String,
    val signatureValue: String,
    val type: String
)

// 执行转换
val gson = Gson()
val listType = object : TypeToken<List<Model>>() {}.type
val myModelList: List<Model> = gson.fromJson(rawJson, listType)

3. 关键注意点

  • 字符串预处理是前提:原始字符串是被引号包裹的JSON字符串,必须先还原为标准JSON数组才能被解析。
  • TypeToken解决泛型擦除:通过它可以保留List<Model>的泛型类型信息,让Gson明确转换目标。
  • 特殊字段映射:JSON中以@开头的键(如@context),需用@SerializedName注解绑定Kotlin字段,因为Kotlin不允许变量名以@开头。

内容的提问来源于stack exchange,提问作者Anshul Tyagi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 05:24:09