我很难找到有关如何反序列化日期字段的文档。我该如何实现这一目标?我在 SO 上找到的大多数解决方案都不起作用,或者它们使用不再可用的类
@Serializable
data class Dashboard(
val someNumber: Int,
val someDate: Date? // Custom Deserialization from unix timestamp
)
Run Code Online (Sandbox Code Playgroud)
编辑:我发现使用的大多数解决方案PrimitiveSerialDescriptor
似乎不可用
我正在尝试序列化一个 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) 我在尝试从发送 NewVehicle 对象的另一个片段读取包时收到此错误。
错误:类“NewVehicle”不是抽象的,并且未实现抽象成员 public Abstract fun describeContents(): Int 在 android.os.Parcelable 中定义
新车.kt
import android.os.Parcelable
import com.google.gson.annotations.SerializedName
import kotlinx.android.parcel.Parcelize
@Parcelize
data class NewVehicle(
@SerializedName("av_se")
val avSe: String,
.....
@SerializedName("vh_ob")
val vhOb: String,
@SerializedName("zo_in")
val zoIn: String
):Parcelable{}
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用和发出包含多态项目列表的 JSON。问题是:这些项目包含type
带有整数值(而不是字符串)的键。 API 端点生成并期望与此类似的 JSON:
{
"startTime": "2022-07-27T13:32:57.379Z",
"items": [
{
"type": 0,
"results": "string",
"restBetweenRounds": "string"
},
{
"type": 1,
"results": "string",
"setCount": 0
},
{
"type": 2,
"items": [
{
"type": 0,
"results": "string",
"restBetweenRounds": "string"
},
{
"type": 1,
"results": "string",
"setCount": 0
}
],
"results": "string"
}
],
"status": 0,
"clientId": "3fa85f64-5717-4562-b3fc-2c963f66afa6"
}
Run Code Online (Sandbox Code Playgroud)
正如有关多态性的文章中所述,我创建了类的层次结构。我还尝试type
在反序列化之前转换值。
object MyTransformingDeserializer : JsonTransformingSerializer<BaseItem>(PolymorphicSerializer(BaseItem::class)) {
override fun transformDeserialize(element: JsonElement): JsonElement {
val type = element.jsonObject["type"]!!
val …
Run Code Online (Sandbox Code Playgroud) 我NoClassDefFoundError
在尝试调用类Foo.serializer()
上的方法时得到了一个@Serializable
。
这是我的测试用例:
@Serializable
data class Foo(val data: String)
val jsonString = json.stringify(
Foo.serializer(), // <= Error happens here
Foo(data = "foo")
)
Run Code Online (Sandbox Code Playgroud)
尝试运行代码会导致以下堆栈跟踪:
java.lang.NoSuchMethodError: 'void kotlinx.serialization.internal.SerialClassDescImpl.<init>(java.lang.String, kotlinx.serialization.internal.GeneratedSerializer, int)'
at com.example.Foo$$serializer.<clinit>(Foo.kt:7)
at com.example.Foo$Companion.serializer(Foo.kt)
Run Code Online (Sandbox Code Playgroud) 我发现了很多关于这个主题的东西,但还不足以解决它,所以我就开始吧。
我刚刚开始一个新项目,他们遇到了一个严重的问题:
import kotlinx.android.synthetic
Run Code Online (Sandbox Code Playgroud)
Android Studio 无法解决。项目运行起来,构建过程中没有问题,但是 Android Studio 在代码中向我显示了很多错误,因为它无法识别布局。这意味着布局/组件没有快捷方式。
我认为我们已经导入了正确的插件:
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
apply plugin: 'kotlin-kapt'
apply plugin: 'org.jetbrains.kotlin.android.extensions'
Run Code Online (Sandbox Code Playgroud)
我尝试删除 apply plugin: 'org.jetbrains.kotlin.android.extensions',但没有帮助。我们的构建脚本依赖项中还有类路径“org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version”。
不是 Gradle 专家,但欢迎寻求任何帮助!
我只是想尝尝 Kotlin 协程。不幸的是,我无法kotlinx
在IntelliJ
. 我已经通过Maven
.
IntelliJ
建议kotlinx
。我已经尝试了网络上的大多数解决方案。但没有任何效果。
以下是我正在执行的步骤。
做了一个新项目。
kotlinx
由于尚未添加库,因此带有下划线。
在project structure > modules > dependencies > add > library > maven
搜索kotlinx
库中。
下载了库。
应用设置。
kotlinx
库现在在该External Libraries
部分中可见。
甚至自动完成现在也提示kotlinx
.
尽管如此,什么都没有改变。结果是一样的。
我有一个 Json 输入,例如:
\n{\n "type": "type_1",\n "data": {\n // ...\n }\n}\n
Run Code Online (Sandbox Code Playgroud)\ndata
字段可能会有所不同,具体取决于type
。
所以,我需要一个反序列化器,它分别查看type
(enum) 和反序列化data
(例如,对于type_1
值它是Type1
类,对于type_2
\xe2\x80\x94Type2
等)。
我考虑过一个完全自定义的反序列化器(扩展 a KSerializer<T>
),但它看起来有点矫枉过正。
进行此类反序列化的最佳(kotlin)方法是什么?
\n我们正在使用 kotlin multiplatform 进行公司的下一个项目。一切正常,直到我尝试为 android 创建一个发布版本以进行 beta 测试。我在发布版本中遇到此错误,而在调试中一切正常。
[NetworkManager] unknown exception: l.a.w: Can't locate argument-less serializer for class a. For generic classes, such as lists, please provide serializer explicitly.
Run Code Online (Sandbox Code Playgroud)
这是项目级 build.gradle
buildscript {
ext.kotlin_version = '1.3.70'
ext.versions = [
"ktor" : "1.3.2",
"serialization" : "0.20.0",
"coroutines" : "1.3.6",
]
repositories {
maven { url 'https://maven.google.com' }
maven { url 'https://dl.google.com/dl/android/maven2' }
maven { url "https://s3-eu-west-1.amazonaws.com/elasticode-sdk/Android/maven/" }
google()
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.6.3'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
classpath "org.jetbrains.kotlin:kotlin-serialization:$kotlin_version"
classpath 'com.google.firebase:firebase-crashlytics-gradle:2.2.0'
classpath …
Run Code Online (Sandbox Code Playgroud) android kotlin kotlin-multiplatform kotlinx.serialization kotlinx
kotlin ×9
kotlinx ×9
android ×4
gradle ×1
json ×1
parcel ×1
parcelable ×1
polymorphism ×1
synthetic ×1