使用 Klaxon 序列化 JSON

Posted

技术标签:

【中文标题】使用 Klaxon 序列化 JSON【英文标题】:Serialize JSON with Klaxon 【发布时间】:2021-06-28 15:28:06 【问题描述】:

我正在尝试为 Kotlin 中的多种类型的类开发一个允许对 JSON 进行序列化/反序列化的系统。对于反序列化,我使用 klaxon,但我也想将它用于序列化。我对此进行了一些研究,但没有得到确凿的答案。

那么,我可以这样做吗?如果是这样,怎么办?或者我应该为此目的使用其他库吗?

这是我的代码

package com.pineapple.threadio

import com.beust.klaxon.Klaxon
import com.beust.klaxon.TypeAdapter
import com.beust.klaxon.TypeFor
import kotlin.reflect.KClass

// Frame types

@TypeFor(field = "id", adapter = FrameTypeAdapter::class)
open class BasicFrame(val id: String)
class Ping : BasicFrame("0x0000")
class TransactionRequest : BasicFrame("0x0001")
class TransactionAccept : BasicFrame("0x0002")
class TransactionDeny(val deny_reason: String) : BasicFrame("0x0003")

// Frame processing
class Frame(
    @TypeFor(field = "id", adapter = FrameTypeAdapter::class)
    val id: String,

    val frame: BasicFrame
)

class FrameTypeAdapter : TypeAdapter<BasicFrame> 
    override fun classFor(id: Any): KClass<out BasicFrame> = when (id as String) 
        "0x0000" -> Ping::class
        "0x0001" -> TransactionRequest::class
        "0x0002" -> TransactionAccept::class
        "0x0003" -> TransactionDeny::class
        else -> throw IllegalArgumentException("Unknown frame ID: $id")
    


// Actual parsing, straight from klaxon's docs
val frame = Klaxon().parseArray<Frame>(json)

【问题讨论】:

你想要解析的 JSON 是什么样子的? 看起来像这样: "id":"0x0001" 但会有更复杂的 【参考方案1】:

@TypeFor(field = "id", adapter = FrameTypeAdapter::class) 注解应该放在BasicFrame 类上。它在你放置它的地方是多余的。

【讨论】:

谢谢,我会解决这个问题

以上是关于使用 Klaxon 序列化 JSON的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Klaxon 解析嵌套 JSON 并在 recyclerview 中显示?

如何在 android studio 上使用 klaxon 从 thingspeak 解析 json 以获取字段值?

如何使用 Klaxon 从我的 JSON 文件中的两个数组中获取第一个图像 URL?

Klaxon 解析空枚举

使用 JSON 序列化/反序列化 TimeSpan

使用Newtonsoft.Json.dll(JSON.NET)动态解析JSON.net 的json的序列化与反序列化