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
相关产品推荐
相关产品推荐

