Android 为什么使用Gson反序列化到另一个类后会生成LinkedTreeMap?
我有如下JSON结构:Android 为什么使用Gson反序列化到另一个类后会生成LinkedTreeMap?,android,json,kotlin,gson,Android,Json,Kotlin,Gson,我有如下JSON结构: { "status": 0, "error_message": null, "data": { "1": { "7": [ { "id": "1", "person_id": "3", "friend_id": "2" } ] } } 正如您所注意到的,索引的数量(1,7)是动态的,我的意思是,它们可以更多。因此,为了解析这个JSON,我决定使用Map7可以用作键。因此,首先,我尝试从JSON中的data获取
{
"status": 0,
"error_message": null,
"data": {
"1": {
"7": [
{
"id": "1",
"person_id": "3",
"friend_id": "2"
}
]
}
}
正如您所注意到的,索引的数量(1,7)是动态的,我的意思是,它们可以更多。因此,为了解析这个JSON,我决定使用Map
<当id、person\u id、friend\u id
可以是一个名为Model
的类时,code>7可以用作键。因此,首先,我尝试从JSON中的data
获取1
,并将其转换为Map
,如上所述。我是这样做的:
val data = myJson.getAsJsonObject("data").get("1")
val gson = Gson()
val type = object : TypeToken<Map<String, ArrayList<Model>>>() {
}.type
val myMap: Map<String, ArrayList<Model>> = gson.fromJson(data, type)
val data=myJson.getAsJsonObject(“数据”).get(“1”)
val gson=gson()
val type=object:TypeToken(){
}.类型
val myMap:Map=gson.fromJson(数据,类型)
一切都很好,直到我提到了我的模型的某个字段。我是这样做的:
val data = myJson.getAsJsonObject("data").get("1")
val gson = Gson()
val type = object : TypeToken<Map<String, ArrayList<Model>>>() {
}.type
val myMap: Map<String, ArrayList<Model>> = gson.fromJson(data, type)
首先,我试着引用myMap
如下:
{
"status": 0,
"error_message": null,
"data": {
"1": {
"7": [
{
"id": "1",
"person_id": "3",
"friend_id": "2"
}
]
}
}
如您所见,这里没有获取Model
,而是有LinkedTreeMap
的列表。因此,当我参考Model
字段时,我得到了CastException
那么,如何解决这个问题呢?我没有使用TypeToken
尝试过这个,但没有任何帮助 你给了错误的json一个闭包“}”我想你复制错了
创建Gson2Application类
class Gson2Application
val jj = "{\n" +
"\"status\": 0,\n" +
"\"error_message\": null,\n" +
"\"data\": {\n" +
"\"1\": {\n" +
" \"7\": [\n" +
" {\n" +
" \"id\": \"1\",\n" +
" \"person_id\": \"3\",\n" +
" \"friend_id\": \"2\"\n" +
" }\n" +
" ]\n" +
" }\n" +
"}\n" +
"}"
data class Model(val id: Long, val person_id: Long, val friend_id: Long)
fun main(args: Array<String>) {
var myJson = JsonParser().parse(jj).asJsonObject
val data = myJson.getAsJsonObject("data").get("1")
val type = object : TypeToken<Map<String, ArrayList<Model>>>() {}.type // the Map is interfacem then gson get default LinkedTreeMap extedn AbstractMap<K,V> implements Map
val fromMapDefault = Gson().fromJson<Map<String, List<Model>>>(data, type)
printResult(fromMapDefault)
// result
// {{7=[Model(id=1, person_id=3, friend_id=2)]} class com.google.gson.internal.LinkedTreeMap--> 1}
// {[Model(id=1, person_id=3, friend_id=2)] class java.util.ArrayList--> 1}
// {Model(id=1, person_id=3, friend_id=2) class pl.jac.gson2.Model --> 2}
// {1 long--> 3}
val typeHashMap = object : TypeToken<HashMap<String, ArrayList<Model>>>() {}.type // the HashMap is an implementation
val fromHashMap = Gson().fromJson<Map<String, List<Model>>>(data, typeHashMap)
printResult(fromHashMap)
//result
// {{7=[Model(id=1, person_id=3, friend_id=2)]} class java.util.HashMap--> 1}
// {[Model(id=1, person_id=3, friend_id=2)] class java.util.ArrayList--> 1}
// {Model(id=1, person_id=3, friend_id=2) class pl.jac.gson2.Model --> 2}
// {1 long--> 3}
}
private fun printResult(fromMapDefault: Map<String, List<Model>>) {
println("""
result
{${fromMapDefault} ${fromMapDefault?.javaClass}--> 1}
{${fromMapDefault["7"]} ${fromMapDefault["7"]?.javaClass}--> 1}
{${fromMapDefault["7"]?.get(0)} ${fromMapDefault["7"]?.get(0)?.javaClass} --> 2}
{${fromMapDefault["7"]?.get(0)?.id} ${fromMapDefault["7"]?.get(0)?.id?.javaClass}--> 3}
""".trimIndent())
}
}
private fun printResult(fromMapDefault: Map<String, List<Model>>) {
println("""
result
{${fromMapDefault} ${fromMapDefault?.javaClass}--> 1}
{${fromMapDefault["7"]} ${fromMapDefault["7"]?.javaClass}--> 1}
{${fromMapDefault["7"]?.get(0)} ${fromMapDefault["7"]?.get(0)?.javaClass} --> 2}
{${fromMapDefault["7"]?.get(0)?.id} ${fromMapDefault["7"]?.get(0)?.id?.javaClass}--> 3}
""".trimIndent())
}
class GSON2应用程序
val jj=“{\n”+
“状态”:0\n+
“错误信息”:空,\n+
“\”数据\“:{\n”+
“\“1\”:{\n”+
“\“7\”:[\n”+
“{\n”+
“id\:\“1\,\n”+
“\'person\u id\”:\'3\,\n”+
“\'friend\u id\':\'2\'\n”+
“}\n”+
“]\n”+
“}\n”+
“}\n”+
"}"
数据类模型(val-id:Long,val-person\u-id:Long,val-friend\u-id:Long)
趣味主线(args:Array){
var myJson=JsonParser().parse(jj).asJsonObject
val data=myJson.getAsJsonObject(“数据”).get(“1”)
val type=object:TypeToken(){}.type//映射为interfaceem,然后gson get default LinkedTreeMap extedn AbstractMap实现映射
val fromMapDefault=Gson().fromJson(数据,类型)
打印结果(fromMapDefault)
//结果
//{7=[Model(id=1,person_id=3,friend_id=2)]}class com.google.gson.internal.LinkedTreeMap-->1}
//{[Model(id=1,person\u id=3,friend\u id=2)]类java.util.ArrayList-->1}
//{Model(id=1,person_id=3,friend_id=2)类pl.jac.gson2.Model-->2}
//{1长-->3}
val typeHashMap=object:TypeToken(){}.type//HashMap是一个实现
val fromHashMap=Gson().fromJson(数据,类型HashMap)
打印结果(来自HashMap)
//结果
//{{7=[Model(id=1,person_id=3,friend_id=2)]类java.util.HashMap-->1}
//{[Model(id=1,person\u id=3,friend\u id=2)]类java.util.ArrayList-->1}
//{Model(id=1,person_id=3,friend_id=2)类pl.jac.gson2.Model-->2}
//{1长-->3}
}
private fun printResult(fromMapDefault:Map){
println(“”)
结果
{${fromMapDefault}${fromMapDefault?.javaClass}-->1}
{${fromMapDefault[“7”]}${fromMapDefault[“7”]?.javaClass}-->1}
{${fromMapDefault[“7”]?.get(0)}${fromMapDefault[“7”]?.get(0)?.javaClass}-->2}
{${fromMapDefault[“7”]?.get(0)?.id}${fromMapDefault[“7”]?.get(0)?.id?.javaClass}-->3}
“.trimIndent())
}
}
private fun printResult(fromMapDefault:Map){
println(“”)
结果
{${fromMapDefault}${fromMapDefault?.javaClass}-->1}
{${fromMapDefault[“7”]}${fromMapDefault[“7”]?.javaClass}-->1}
{${fromMapDefault[“7”]?.get(0)}${fromMapDefault[“7”]?.get(0)?.javaClass}-->2}
{${fromMapDefault[“7”]?.get(0)?.id}${fromMapDefault[“7”]?.get(0)?.id?.javaClass}-->3}
“.trimIndent())
}
我改为你的模特
data class ClassStatus(val status: Int, val error_message: String?, val data: Map<String,Map<String, ArrayList<Model>>>)
data class Model(val id: Long, val person_id: Long, val friend_id: Long)
fun main(args: Array<String>) {
val fromJson = Gson().fromJson<ClassStatus>(jj, ClassStatus::class.java)
printResult(fromJson)
//result
//ClassStatus(status=0, error_message=null, data={1={7=[Model(id=1, person_id=3, friend_id=2)]}}) class pl.jac.gson2.not.ClassStatus--> 1
//{1={7=[Model(id=1, person_id=3, friend_id=2)]}} class com.google.gson.internal.LinkedTreeMap--> 2
//{7=[Model(id=1, person_id=3, friend_id=2)]} class com.google.gson.internal.LinkedTreeMap--> 3
//[Model(id=1, person_id=3, friend_id=2)] class java.util.ArrayList--> 4
//Model(id=1, person_id=3, friend_id=2) class pl.jac.gson2.not.Model--> 5
//1 long--> 6
}
private fun printResult(fromMapDefault: ClassStatus) {
println("""
result
${fromMapDefault} ${fromMapDefault.javaClass}--> 1
${fromMapDefault.data} ${fromMapDefault.data.javaClass}--> 2
${fromMapDefault.data["1"]} ${fromMapDefault.data["1"]?.javaClass}--> 3
${fromMapDefault.data["1"]!!["7"]} ${fromMapDefault.data["1"]!!["7"]!!.javaClass}--> 4
${fromMapDefault.data["1"]?.get("7")!![0]} ${fromMapDefault.data["1"]!!["7"]!![0].javaClass}--> 5
${fromMapDefault.data["1"]?.get("7")!![0].id} ${fromMapDefault.data["1"]!!["7"]!![0].id!!.javaClass}--> 6
""".trimIndent())
}
val jj = "{\n" +
"\"status\": 0,\n" +
"\"error_message\": null,\n" +
"\"data\": {\n" +
"\"1\": {\n" +
" \"7\": [\n" +
" {\n" +
" \"id\": \"1\",\n" +
" \"person_id\": \"3\",\n" +
" \"friend_id\": \"2\"\n" +
" }\n" +
" ]\n" +
" }\n" +
"}\n" +
"}"
数据类类状态(val状态:Int,val错误\u消息:String?,val数据:Map)
数据类模型(val-id:Long,val-person\u-id:Long,val-friend\u-id:Long)
趣味主线(args:Array){
val fromJson=Gson().fromJson(jj,ClassStatus::class.java)
打印结果(来自JSON)
//结果
//ClassStatus(status=0,error\u message=null,data={1={7=[Model(id=1,person\u id=3,friend\u id=2)]})类pl.jac.gson2.not.ClassStatus-->1
//{1={7=[Model(id=1,person_id=3,friend_id=2)]}class com.google.gson.internal.LinkedTreeMap-->2
//{7=[Model(id=1,person_id=3,friend_id=2)]}class com.google.gson.internal.LinkedTreeMap-->3
//[Model(id=1,person\u id=3,friend\u id=2)]类java.util.ArrayList-->4
//Model(id=1,person\u id=3,friend\u id=2)类pl.jac.gson2.not.Model-->5
//1长-->6
}
private fun printResult(fromMapDefault:ClassStatus){
println(“”)
结果
${fromMapDefault}${fromMapDefault.javaClass}-->1
${fromMapDefault.data}${fromMapDefault.data.javaClass}-->2
${fromMapDefault.data[“1”]}${fromMapDefault.data[“1”]?.javaClass}-->3
${fromMapDefault.data[“1”]!![“7”]}${fromMapDefault.data[“1”]!![“7”]!!.javaClass}-->4
${fromMapDefault.data[“1”]?.get(“7”)!![0]}${fromMapDefault.data[“1”]!![“7”]!![0]。javaClass}-->5
${fromMapDefault.data[“1”]?.get(“7”)!![0].id}${fromMapDefault.data[“1”]!![0].id!!.javaClass}-->6
“.trimIndent())
}
val jj=“{\n”+
“状态”:0\n+
“错误信息”:空,\n+
“\”数据\“:{\n”+
“\“1\”:{\n”+
“\“7\”:[\n”+
“{\n”+
“id\:\“1\,\n”+
“\'person\u id\”:\'3\,\n”+
“\'friend\u id\':\'2\'\n”+
“}\n”+
“]\n”+
“}\n”+
“}\n”+
"}"