Kotlin本地端口接收JSON消息解码失败问题求助
问题分析与解决
核心问题
你遇到的解析错误由两个主要原因导致:
- 字段类型与序列化注解缺失:服务器发送的JSON字段值是字符串类型,你的
RacerStatus类最初用Int类型不匹配;同时缺少kotlinx.serialization必需的@Serializable注解,导致序列化逻辑无法正常工作。 - 接收字节数组含多余垃圾数据:本地端口接收的字节数组末尾存在大量非UTF-8无关符号,JSON解析器读取完有效内容后遇到意外字符,触发EOF异常。
解决方案
1. 修正类定义与字段类型
补全序列化注解,将字段类型改为字符串以匹配服务器JSON格式:
import kotlinx.serialization.Serializable import kotlinx.serialization.json.Json @Serializable data class RacerStatus( val SensorId: String, val RacerBibNumber: String, val Timestamp: String ) { fun encode(): ByteArray { // 指定UTF-8编码,确保与解码字符集一致 return Json.encodeToString(this).toByteArray(Charsets.UTF_8) } }
2. 过滤接收字节数组中的垃圾数据
解码前提取有效JSON部分,丢弃末尾无关符号:
companion object { fun decode(bytes: ByteArray): RacerStatus { val inputString = bytes.toString(Charsets.UTF_8) // 定位最后一个}的位置,截取有效JSON子串 val validJsonEnd = inputString.lastIndexOf('}') if (validJsonEnd == -1) { println("Invalid JSON format received") return RacerStatus("0", "0", "0") } val validJson = inputString.substring(0, validJsonEnd + 1).trim() return try { Json.decodeFromString(validJson) } catch (e: Exception) { println("Error decoding message: $e") RacerStatus("0", "0", "0") } } }
关键说明
@Serializable注解是kotlinx.serialization的核心依赖,缺失会直接导致序列化/反序列化失败。- 统一使用
UTF-8编码解码,避免字符集不一致引发的乱码或解析异常。 - 通过定位
}截断垃圾数据,从根源解决解析器遇到意外字符的问题。
内容的提问来源于stack exchange,提问作者Hamilton Hardy
相关产品推荐
相关产品推荐

