Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/197.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 为什么使用Gson反序列化到另一个类后会生成LinkedTreeMap?_Android_Json_Kotlin_Gson - Fatal编程技术网

Android 为什么使用Gson反序列化到另一个类后会生成LinkedTreeMap?

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获取

我有如下JSON结构:

{
"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”+
"}"