Kotlinx-serialization:序列化不带引号的原始字符串

Kar*_*iel 4 json kotlin json-serialization kotlinx.serialization

我试图实现的目标

使用Jackson进行序列化,有@JsonRawValue注解实现字符串值不带引号序列化。例如,使用以下代码

data class SomeData {
   @JsonRawValue
   value: String
}
Run Code Online (Sandbox Code Playgroud)

我可以序列化SomeData("{}")并获取:

{ "value": {} }
Run Code Online (Sandbox Code Playgroud)

(如果没有注释,那就是{ "value": "{}" }。)

我想使用 Kotlin 序列化来实现相同的目的。

为什么我想要那个

我想要这个的原因是我通过 Rest 获取一个对象,将其存储在数据库中,稍后从那里加载它并返回它而不更改内容。我不关心对象中包含什么。所以我绝对不需要以任何方式解析或反序列化它。在最坏的情况下,内容会在过程中的某个地方被更改。在最好的情况下,这只是一些多余的计算。

我尝试过的

kotlinx-serialization 中似乎没有相应的机制支持这种开箱即用的操作。查看源代码,似乎我需要一个带有 a 的类JsonPrimitive(或JsonLiteral)实例String value,但isString设置为 false,但没有办法得到它。

另一种方法可能是编写一个序列化器来序列化String不带引号的值,但我不知道如何实现。

aSe*_*emy 5

从 Kotlinx 序列化版本 1.4 开始,无法对不带引号的 JSON 文字字符串进行编码。

不过,在下一个版本中这将是可能的!https://github.com/Kotlin/kotlinx.serialization/pull/2041#issuecomment-1287049243

如需先睹为快,请查看分支上的文档dev

import java.math.BigDecimal

val format = Json { prettyPrint = true }

fun main() {
    val pi = BigDecimal("3.141592653589793238462643383279")

    // use JsonUnquotedLiteral to encode raw JSON content
    val piJsonLiteral = JsonUnquotedLiteral(pi.toString())

    val piJsonDouble = JsonPrimitive(pi.toDouble())
    val piJsonString = JsonPrimitive(pi.toString())
  
    val piObject = buildJsonObject {
        put("pi_literal", piJsonLiteral)
        put("pi_double", piJsonDouble)
        put("pi_string", piJsonString)
    }

    println(format.encodeToString(piObject))
}
Run Code Online (Sandbox Code Playgroud)

pi_literal按字面编码,不加引号。

{
    "pi_literal": 3.141592653589793238462643383279,
    "pi_double": 3.141592653589793,
    "pi_string": "3.141592653589793238462643383279"
}
Run Code Online (Sandbox Code Playgroud)