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不带引号的值,但我不知道如何实现。
从 Kotlinx 序列化版本 1.4 开始,无法对不带引号的 JSON 文字字符串进行编码。
不过,在下一个版本中这将是可能的!https://github.com/Kotlin/kotlinx.serialization/pull/2041#issuecomment-1287049243
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)
| 归档时间: |
|
| 查看次数: |
1927 次 |
| 最近记录: |