Kotlin Jackson-无法反序列化'java.util.ArrayList'的实例,该实例不在起始\u对象标记中
我试图通过HTTP请求从我的背部获取一些数据,并将其映射为模型的可变列表 代码在两种情况下完全相同,但其中一种不起作用,我第一次出错了?我在谷歌上搜索过,但所有的代码示例都与我的不同,解决方案也不同 这就是我的错误:Kotlin Jackson-无法反序列化'java.util.ArrayList'的实例,该实例不在起始\u对象标记中,kotlin,jackson,data-class,Kotlin,Jackson,Data Class,我试图通过HTTP请求从我的背部获取一些数据,并将其映射为模型的可变列表 代码在两种情况下完全相同,但其中一种不起作用,我第一次出错了?我在谷歌上搜索过,但所有的代码示例都与我的不同,解决方案也不同 这就是我的错误: D/OkHttp: Callback failure for call to http://10.0.2.2:5000/... D/OkHttp: com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot
D/OkHttp: Callback failure for call to http://10.0.2.2:5000/...
D/OkHttp: com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize instance of `java.util.ArrayList` out of START_OBJECT token
D/OkHttp: at [Source: (String)"{"recurrenceId":1,"meetingId":4,"weekDay":21}"; line: 1, column: 1]
D/OkHttp: at com.fasterxml.jackson.databind.DeserializationContext.reportInputMismatch(DeserializationContext.java:1343)
D/OkHttp: at com.fasterxml.jackson.databind.DeserializationContext.handleUnexpectedToken(DeserializationContext.java:1139)
D/OkHttp: at com.fasterxml.jackson.databind.DeserializationContext.handleUnexpectedToken(DeserializationContext.java:1093)
D/OkHttp: at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.handleNonArray(CollectionDeserializer.java:332)
D/OkHttp: at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:265)
D/OkHttp: at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:245)
D/OkHttp: at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:27)
D/OkHttp: at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:4013)
at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3023)
D/OkHttp: at fr.intech.neith.api.RecurrenceApi.toDo(RecurrenceApi.kt:34)
at fr.intech.neith.helpers.ApiHelper$GET$1.onResponse(ApiHelper.kt:35)
D/OkHttp: at okhttp3.RealCall$AsyncCall.execute(RealCall.java:174)
at okhttp3.internal.NamedRunnable.run(NamedRunnable.java:32)
D/OkHttp: at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
D/OkHttp: at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
at java.lang.Thread.run(Thread.java:764)
这是我的数据类:
package fr.intech.neith.models
data class Recurrence(val recurrenceId: Int = 0,
val meetingId: Int = 0,
val weekDay: Array<Int> = arrayOf())
fr.intech.neith.models包
数据类重复(val recurrenceId:Int=0,
val meetingId:Int=0,
val weekDay:Array=arrayOf())
这是我发出GET请求的API:
package fr.intech.neith.api
import...
class RecurrenceApi(context: Context): IOnApiResponse {
var itodo: IToDoRecurrenceList? = null
override fun toDo(body: String) {
val mapper = ObjectMapper()
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
//val reader: ObjectReader = mapper.reader().forType(Meeting.class);
val reader = mapper.readValue<MutableList<Recurrence>>(body)
itodo!!.toExecuteR(reader)
}
var client = OkHttpClient()
var api = ApiHelper(client, context)
var url: String = "http://10.0.2.2:5000" + "/api/recurrence" // 192.168.43.135 4G - 10.0.2.2 ÉMULATEUR
fun getRecurrenceList(meetingId: Int, cb: IToDoRecurrenceList) {
val url2: String = url + "/${meetingId}";
itodo = cb
api.GET(url2, this)
}
}
软件包fr.intech.neith.api
导入。。。
类RecurrenceApi(上下文:context):IOnApiResponse{
变量itodo:IToDoRecurrenceList?=null
覆盖有趣的toDo(正文:字符串){
val mapper=ObjectMapper()
configure(在未知属性上反序列化feature.FAIL,false)
//val reader:ObjectReader=mapper.reader().forType(Meeting.class);
val reader=mapper.readValue(正文)
itodo!!.toExecuteR(阅读器)
}
var client=OkHttpClient()
var api=ApiHelper(客户端,上下文)
变量url:字符串=”http://10.0.2.2:5000“+”/api/recurrence”//192.168.43.135 4G-10.0.2.2ÉMULATEUR
fun getRecurrenceList(会议ID:Int,cb:ItodorRecurrenceList){
val url2:String=url+“/${meetingId}”;
itodo=cb
GET(url2,this)
}
}
这里有什么问题吗
下面是一个工作示例,与第一个示例完全相似,因为它的工作方式相同:
package fr.intech.neith.models
import java.io.Serializable
import java.util.*
data class Meeting(val hostFirstName: String = "",
val hostLastName: String = "",
val estimatedTime: String = "",
val startDate: Date = Date(),
val meetingId: Int = 0,
val name: String = "",
val hasEnded: Boolean = false,
val hostId: Int = 0,
val recurrence: Array<Int> = arrayOf(),
val index: Int = 0,
val isRecurrent: Boolean = false): Serializable
package fr.intech.neith.api
import android.content.Context
import com.fasterxml.jackson.databind.DeserializationFeature
import com.fasterxml.jackson.databind.ObjectMapper
import com.fasterxml.jackson.module.kotlin.readValue
import fr.intech.neith.IOnApiResponse
import fr.intech.neith.IToDoList
import fr.intech.neith.helpers.*
import fr.intech.neith.models.Meeting
import okhttp3.OkHttpClient
class MeetingApi(context: Context): IOnApiResponse {
var itodo: IToDoList<Meeting>? = null
override fun toDo(body: String) {
val mapper = ObjectMapper()
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
val reader = mapper.readValue<MutableList<Meeting>>(body)
itodo!!.toExecute(reader)
}
var client = OkHttpClient()
var api = ApiHelper(client, context)
var url: String = "http://10.0.2.2:5000" + "/api/meeting" // 192.168.43.135 4G - 10.0.2.2 ÉMULATEUR
fun getMeetingList(userId: Int, cb: IToDoList<Meeting>) {
val url2: String = url + "/${userId}/names"
itodo = cb
api.GET(url2, this)
}
}
fr.intech.neith.models包
导入java.io.Serializable
导入java.util*
数据类会议(val hostFirstName:String=“”,
val hostLastName:String=“”,
val estimatedTime:String=“”,
val startDate:日期=日期(),
val meetingId:Int=0,
val name:String=“”,
val hasend:Boolean=false,
val hostId:Int=0,
val递归:Array=arrayOf(),
val索引:Int=0,
val isRecurrent:Boolean=false):可序列化
包装fr.intech.neith.api
导入android.content.Context
导入com.fasterxml.jackson.databind.DeserializationFeature
导入com.fasterxml.jackson.databind.ObjectMapper
导入com.fasterxml.jackson.module.kotlin.readValue
进口fr.intech.neith.IOnApiResponse
进口fr.intech.neith.IToDoList
导入fr.intech.neith.helpers*
进口fr.intech.neith.models.MENTING
导入okhttp3.OkHttpClient
类MeetingApi(上下文:上下文):IOnApiResponse{
变量itodo:IToDoList?=null
覆盖有趣的toDo(正文:字符串){
val mapper=ObjectMapper()
configure(在未知属性上反序列化feature.FAIL,false)
val reader=mapper.readValue(正文)
itodo!!.toExecute(阅读器)
}
var client=OkHttpClient()
var api=ApiHelper(客户端,上下文)
变量url:字符串=”http://10.0.2.2:5000“+”/api/meeting”//192.168.43.135 4G-10.0.2.2ÉMULATEUR
有趣的getMeetingList(userId:Int,cb:IToDoList){
val url2:String=url+“/${userId}/names”
itodo=cb
GET(url2,this)
}
}
谢谢你的回答
编辑:这解决了问题:mapper.configure(反序列化功能。接受单个值作为数组,true)
来自:
为了反序列化Kotlin数据类,我们必须在ObjectMapper实例上注册Jackson的Kotlin模块
添加对Kotlin类和数据类的序列化/反序列化支持的模块。以前,Kotlin对象上必须存在默认构造函数,Jackson才能反序列化到该对象中。通过该模块,可以自动使用单个构造函数类,并且还支持具有二级构造函数或静态工厂的构造函数类
我更新了我的帖子,用了一个看起来完全一样但有效的工作示例。我认为问题真的很小,应该以同样的方式解决。我没有看太多你的链接,但这似乎是我在这里做的。是的,你是对的。我没有看到'com.fasterxml.jackson.module.kotlin.readValue'导入。显示json有效负载。在一个小的调试会话之后,我的请求似乎没有得到答案,我将首先解决这个问题。(很抱歉导入,第一个示例中没有显示,因为太多了)我有一个小的异步问题,通过调试并让请求得到答案,我发现了一个新的错误,我编辑了我的帖子。