import kotlinx.serialization.Serializable
@Serializable
sealed class Exercise(open val id: String) {
@Serializable
data class Theory(override val id: String) : Exercise(id)
}
Run Code Online (Sandbox Code Playgroud)
我的代码中有这样的密封类,编译器告诉我:
Serializable class has duplicate serial name of property 'id', either in the class itself or its supertypes。
有没有办法在可序列化的密封类中拥有 open val,在覆盖它时可以正常工作?
我想在 Kotlin 多平台项目中使用 kotlinx.serialization 解码包含多态类结构中的对象列表的 json 字符串,但它仅适用于 JVM,不适用于 Native。这是一个最小的可重现示例:
\n@Serializable\nabstract class Project {\n abstract val name: String\n}\n\n@Serializable\n@SerialName("BasicProject")\ndata class BasicProject(override val name: String): Project()\n\n@Serializable\n@SerialName("OwnedProject")\ndata class OwnedProject(override val name: String, val owner: String) : Project()\n\nfun main() {\n val data = Json.decodeFromString<List<Project>>("""\n [\n {"type":"BasicProject","name":"example"},\n {"type":"OwnedProject","name":"kotlinx.serialization","owner":"kotlin"} \n ]\n """))\n} \nRun Code Online (Sandbox Code Playgroud)\n这适用于 JVM,但在 Native 上会引发以下异常:
\nkotlinx.serialization.SerializationException: Serializer for class \xe2\x80\x98Project\xe2\x80\x99 is not found.\nMark the class as @Serializable or provide the serializer explicitly.\nOn Kotlin/Native explicitly declared serializer should be used for interfaces and …Run Code Online (Sandbox Code Playgroud) json kotlin json-deserialization kotlin-native kotlinx.serialization
如何使用kotlinx.serialization将库类序列化为 Protobuf ?由于它不可编辑,因此我无法@SerialId按照runtime_usage.md#protobuf 中的说明为其属性添加注释。如果我像custom_serializers.md那样编写自己的外部序列化程序,它不会告诉我如何SerialId为 Protobuf 序列化指定s。
例如,我试图序列化 a java.math.BigDecimal,将其存储为unscaledValueasbytes和scaleas sint32。使用原始的 Protobuf Java 库很容易做到,但我想知道如何使用kotlinx.serialization做到这一点。
我有一个简单的层次结构,包含以下内容:
它们都应该与 Kotlinx 序列化一起使用。一切都很顺利,直到我添加了Backpack课程。我使用1.4.32Kotlinx 序列化版本。
这是我的类层次结构的详细信息
// Items.kt
@Serializable
sealed class BaseItem {
abstract val id: String
abstract val type: ItemType
abstract var brand: String
abstract var model: String
abstract var imageLink: String
abstract var traits: MutableList<Trait>
abstract var implicitTraits: MutableList<Trait>
abstract var details: MutableMap<String, String>
}
@Serializable
open class Item(
override val id: String = UUID.randomUUID().toString(),
override val type: ItemType = ItemType.UNDEFINED,
override var brand: String, …Run Code Online (Sandbox Code Playgroud) 我很难找到有关如何反序列化日期字段的文档。我该如何实现这一目标?我在 SO 上找到的大多数解决方案都不起作用,或者它们使用不再可用的类
@Serializable
data class Dashboard(
val someNumber: Int,
val someDate: Date? // Custom Deserialization from unix timestamp
)
Run Code Online (Sandbox Code Playgroud)
编辑:我发现使用的大多数解决方案PrimitiveSerialDescriptor似乎不可用
假设我正在上课:
@Serializable
data class MyClass(
@SerialName("a") val a: String?,
@SerialName("b") val b: String
)
Run Code Online (Sandbox Code Playgroud)
假设aisnull和b的值为“b 值”,则Json.stringify(MyClass.serializer(), this)产生:
{ "a": null, "b": "b value" }
Run Code Online (Sandbox Code Playgroud)
基本上如果a是null,我想得到这个:
{ "b": "b value" }
Run Code Online (Sandbox Code Playgroud)
从一些研究中,我发现这在 Kotlinx Serialization 中是无法开箱即用的,所以我试图构建一个自定义序列化器来显式忽略null值。我从这里开始遵循指南,但无法做出正确的指南。
有人可以照亮我吗?谢谢。
serialization kotlin json-deserialization kotlinx.serialization
我正在尝试序列化一个 json,但它抛出了 JsonDecodingException。检查代码:
SerializationTestCase.kt:
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
import kotlinx.serialization.decodeFromString
import kotlinx.serialization.json.Json
import kotlinx.serialization.modules.SerializersModule
import kotlinx.serialization.modules.polymorphic
import org.junit.Test
class SerializationTestCase {
private val json = Json {
ignoreUnknownKeys = true
isLenient = true
prettyPrint = true
allowStructuredMapKeys = true
encodeDefaults = true
classDiscriminator = "#class"
serializersModule = SerializersModule {
polymorphic(Module::class) {
subclass(TeamModule::class, TeamModule.serializer())
}
}
}
@Test
fun test() {
val inputJson = """
[
{
"type": "team",
"data": {
"readOnly": true
}
}
]
""".trimIndent()
val moduleList: List<Module> = …Run Code Online (Sandbox Code Playgroud) 我正在编写一个 Kotlin 多平台项目(JVM/JS),我正在尝试使用 Kotlinx.serialization 将 HTTP Json 数组响应解析为 Map
JSON 是这样的:
[{"someKey": "someValue"}, {"otherKey": "otherValue"}, {"anotherKey": "randomText"}]
Run Code Online (Sandbox Code Playgroud)
到目前为止,我能够将 JSON 作为字符串获取,但是我找不到任何文档来帮助我构建 Map 或其他类型的对象。所有这些都说明了如何序列化静态对象。
我无法使用,@SerialName因为密钥未固定。
当我尝试返回 a 时Map<String, String>,出现此错误:
Can't locate argument-less serializer for class kotlin.collections.Map. For generic classes, such as lists, please provide serializer explicitly.
Run Code Online (Sandbox Code Playgroud)
最后,我想得到一个Map<String, String>或一个List<MyObject>我的对象可以在哪里MyObject(val id: String, val value: String)
有没有办法做到这一点?否则,我只想编写一个字符串阅读器来解析我的数据。
我想弄清楚如何检查 http 请求的 http 状态代码 Ktor
我有一个像这样的简单 GET 请求,其中包含一个 HttpResponseObject 保存服务器返回的数据以及我控制的任何错误服务器端
val response:HttpResponseObject<MyObject> = client.get<HttpResponseObject<MyObject>>(url)
Run Code Online (Sandbox Code Playgroud)
现在我还需要能够检查的是是否存在服务器抛出的未处理异常或身份验证异常。在这些情况下,服务器不会返回任何内容,并且会返回状态代码 500 或 401 错误。
我看到文档有你可以用这样的东西获得完整的http响应
val response:HttpResponse client.get(url)
Run Code Online (Sandbox Code Playgroud)
但是如何丢失我的序列化数据回来,我找不到任何关于如何从HttpResponse对象序列化它的例子。
有没有人有什么建议?有没有办法从我的第一个示例中获取 http 状态代码?
使用 GSON,我们过去常常@SerializedName解析 JSON 对象,该对象与 Kotlin 中的变量名没有相同的键。
data class User (
@SerializedName("id")
long userId;
@SerializedName("fullName")
String name;
)
Run Code Online (Sandbox Code Playgroud)
在kotlinx.serialization我们可以序列化这样的,但如何让在不同的JSON关键,varaible对象(德)序列化?
@Serializable
data class User (
long userId;
String name;
)
Run Code Online (Sandbox Code Playgroud)