You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kotlin本地端口接收JSON消息解码失败问题求助

问题分析与解决

核心问题

你遇到的解析错误由两个主要原因导致:

  1. 字段类型与序列化注解缺失:服务器发送的JSON字段值是字符串类型,你的RacerStatus类最初用Int类型不匹配;同时缺少kotlinx.serialization必需的@Serializable注解,导致序列化逻辑无法正常工作。
  2. 接收字节数组含多余垃圾数据:本地端口接收的字节数组末尾存在大量非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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 16:10:25