Moshi 1.9.1 ไม่สามารถทำให้ชนิด Kotlin เป็นอนุกรมได้


12

ฉันมีรหัสการทำงานที่เป็นอนุกรมข้อมูล / deserializing ใช้ Moshi 1.8.0

การอัปเกรดเป็น 1.9.1 จะนำไปสู่ข้อขัดข้องเมื่อพยายามทำให้เป็นอันดับ:

java.lang.IllegalArgumentException: ไม่สามารถทำให้เป็นอนุกรมชนิด Kotlin com.xxx.Spot การสะท้อนลำดับของคลาส Kotlin โดยไม่ใช้ kotlin-reflect นั้นมีพฤติกรรมที่ไม่ได้กำหนดและไม่คาดคิด กรุณาใช้ KotlinJsonAdapter จากสิ่งประดิษฐ์ moshi-kotlin หรือใช้รหัส gen จากสิ่งประดิษฐ์ moshi-kotlin-codegen

นี่คือรหัส serializer:

val moshi = Moshi.Builder().build()
val dataListType = newParameterizedType(List::class.java, T::class.java)
val adapter: JsonAdapter<List<T>> = moshi.adapter(dataListType)
val json = adapter.toJson(dataList)

และคลาส T ที่สอดคล้องกันคือ

@IgnoreExtraProperties
data class Spot(
    var id: String = "",
    var localizedName: String? = null,
    var type: String = "",
    var location: Location? = null
)

ฉันไม่รู้จะทำอะไรที่นี่

ขอบคุณสำหรับความช่วยเหลือ!


แสดงการพึ่งพาที่คุณใช้
coroutineDispatcher

คำตอบ:


14

คุณต้องเพิ่ม @JsonClass (generateAdapter = true) หน้าคลาสข้อมูลของคุณ

@JsonClass(generateAdapter = true) 
data class Spot(
    var id: String = "",
    var localizedName: String? = null,
    var type: String = "",
    var location: Location? = null
)

2
ทำไมถึงจำเป็น?
Morten Holmgaard

5
... และรวมการกำหนดค่า kapt ที่สอดคล้องกันในงานสร้างของคุณ รายละเอียดได้ที่นี่: github.com/square/moshi/blob/master/README.md#kotlin
Jesse Wilson

1
ขอบคุณมันใช้งานได้! การเพิ่ม @JsonClass (generateAdapter = true) + เปลี่ยนการใช้ gradle จาก 'moshi' เป็น 'moshi-kotlin' + kapt ทำอุบาย
lorenzo

0

คุณสามารถระงับการใช้ไวด์การ์ด@JvmSuppressWildcardsได้

แบบนี้

val adapter: JsonAdapter<List<@JvmSuppressWildcards T>> = moshi.adapter(dataListType)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.