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

如何使用Kotlinx Serialization将Kraken WebSocket JSON数组转Data Class

实现Kotlinx Serialization解析Kraken WebSocket Ticker响应方案

前置配置

首先确保项目已正确集成Kotlinx Serialization:

  • 项目根目录build.gradle.kts添加插件依赖
  • 业务模块build.gradle.kts应用插件并引入序列化核心依赖

对应Data Class定义

返回结构最外层为无键JSON数组,使用@SerialIndex注解按数组下标映射字段,金融类数值统一使用String类型避免浮点精度丢失:

import kotlinx.serialization.Serializable
import kotlinx.serialization.SerialIndex
import kotlinx.serialization.SerialName

// 最外层响应结构,对应4元素JSON数组
@Serializable
data class KrakenTickerResponse(
    @SerialIndex(0)
    val channelId: Int,
    @SerialIndex(1)
    val tickerData: TickerData,
    @SerialIndex(2)
    val messageType: String,
    @SerialIndex(3)
    val tradePair: String
)

// Ticker核心数据结构
@Serializable
data class TickerData(
    @SerialName("a")
    val ask: TickerLevel3, // 卖盘数据
    @SerialName("b")
    val bid: TickerLevel3, // 买盘数据
    @SerialName("c")
    val close: TickerLevel2, // 最新成交数据
    @SerialName("v")
    val volume: TickerPeriodPair, // 成交量
    @SerialName("p")
    val vwap: TickerPeriodPair, // 加权平均价
    @SerialName("t")
    val tradeCount: TickerPeriodIntPair, // 成交笔数
    @SerialName("l")
    val lowPrice: TickerPeriodPair, // 最低价
    @SerialName("h")
    val highPrice: TickerPeriodPair, // 最高价
    @SerialName("o")
    val openPrice: TickerPeriodPair // 开盘价
)

// 三级结构:对应a、b字段的三元素数组
@Serializable
data class TickerLevel3(
    @SerialIndex(0)
    val price: String,
    @SerialIndex(1)
    val orderCount: Int,
    @SerialIndex(2)
    val amount: String
)

// 二级结构:对应c字段的两元素数组
@Serializable
data class TickerLevel2(
    @SerialIndex(0)
    val price: String,
    @SerialIndex(1)
    val amount: String
)

// 双周期字符串对:对应v、p、l、h、o的两元素数组(近24小时/今日)
@Serializable
data class TickerPeriodPair(
    @SerialIndex(0)
    val last24h: String,
    @SerialIndex(1)
    val today: String
)

// 双周期整数对:对应t字段的两元素数组
@Serializable
data class TickerPeriodIntPair(
    @SerialIndex(0)
    val last24h: Int,
    @SerialIndex(1)
    val today: Int
)

反序列化使用示例

import kotlinx.serialization.json.Json

val jsonDecoder = Json {
    ignoreUnknownKeys = true
    coerceInputValues = true // 可选,兼容类型差异
}
// 直接传入WebSocket收到的原始字符串即可完成解析
val tickerResponse = jsonDecoder.decodeFromString<KrakenTickerResponse>(rawWebSocketMsg)

注:@SerialIndex注解需要kotlinx-serialization-core 1.3.0及以上版本支持。


内容的提问来源于stack exchange,提问作者Peter Renz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 10:45:04