Ktor/Kotlinx处理合法JSON时抛出JsonDecodingException问题求助
错误根因
反序列化器解析到JSON偏移量6的位置(即d数组第一个元素的起始{符号)时,预期读取字符串的起始符号",与你定义的List<D>类型规则不匹配,核心原因为D类的序列化配置未生效,导致反序列化器将D类型识别为了字符串类型。
修复方案
- 检查序列化编译插件配置
仅引入kotlinx-serialization依赖无法生效,必须在构建脚本中添加对应编译插件:
Gradle Kotlin DSL配置示例:
plugins { kotlin("jvm") version "和你项目一致的Kotlin版本" kotlin("plugin.serialization") version "和你项目一致的Kotlin版本" }
Maven配置示例:
<plugin> <groupId>org.jetbrains.kotlin</groupId> <artifactId>kotlin-maven-plugin</artifactId> <version>${kotlin.version}</version> <executions> <execution> <id>compile</id> <goals> <goal>compile</goal> </goals> <configuration> <compilerPlugins> <plugin>kotlinx-serialization</plugin> </compilerPlugins> </configuration> </execution> </executions> <dependencies> <dependency> <groupId>org.jetbrains.kotlin</groupId> <artifactId>kotlin-maven-serialization</artifactId> <version>${kotlin.version}</version> </dependency> </dependencies> </plugin>
- 检查注解导入正确性
确认D和IMDBInfo类顶部导入的是kotlinx.serialization.Serializable,不要误导入java.io.Serializable,后者不会被kotlinx-serialization识别。 - 检查D类定义位置
如果D类是StreamingAvailability的内部类(带inner关键字),需要将D类移到StreamingAvailability外部定义,或者去掉inner关键字改为普通嵌套类。带inner的内部类会持有外部类引用,序列化器无法生成对应序列化规则。 - 冗余配置清理
你当前Json配置中的allowStructuredMapKeys属于冗余配置,你的场景不需要结构化Map键支持,可以直接删除。
验证方法
可以先临时将IMDBInfo的d字段类型改为List<JsonElement>,如果运行后可以正常打印内容,即可确认是D类的序列化配置问题,调整配置后再改回List<D>即可。
内容的提问来源于stack exchange,提问作者Jeremy T
相关产品推荐
相关产品推荐

