所以,我有这个类 Item.kt
class Item {
val name = ""
val loc = ""
val price = 0.0
override fun toString() = "$name <$loc> $price"
}
Run Code Online (Sandbox Code Playgroud)
由于此类位于另一个库中(我无法编辑其源代码),因此我有一个外部序列化器。
ItemSerializer.kt
@Serializer(forClass = Item::class)
object ItemSerializer: KSerializer<Item> {
override fun serialize(output: Encoder, obj: Item) {
}
override fun deserialize(input: Decoder): Item {
return df.parse(input.decode())
}
}
Run Code Online (Sandbox Code Playgroud)
现在,困难的部分来了。我可以在另一个类中使用这个类,如下所示
购物车.kt
@Serializable
class Cart {
val id: Long? = null
@Serialize(with=ItemSerializer::class)
val item:Item = Item()
}
Run Code Online (Sandbox Code Playgroud)
但当我使用项目对象列表时,我不知道如何利用我的序列化器。例如
购物车.kt
@Serializable
class Cart {
val id: Long? = null …Run Code Online (Sandbox Code Playgroud) Ktor 的 HttpClient 允许安装 Json 功能。有谁知道这个功能是否可以使用kotlinx.serialization 库还是仅限于 Gson?我有兴趣为MPP项目启用 Json 功能。
我需要使用自定义 DateSerializer 将 ArrayList 序列化为数据类变量,我使用注释的单个日期变量:
@Serializable
data class SearchBundle(
@Serializable(with = DateSerializer::class) var startDate: Date? = null)
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) 我正在尝试反序列化以下字符串:
val stringJson = "{\"decomposed\":[\", \",{\"id\":4944372,\"name\":\"Johny\",\"various\":false,\"composer\":false,\"genres\":[]}]}"
Run Code Online (Sandbox Code Playgroud)
使用以下代码反序列化工作正常
@Serializable
data class Artist(
val decomposed: JsonArray
)
fun main() {
val jsonString = "{\"decomposed\":[\", \",{\"id\":4944372,\"name\":\"Johny\",\"various\":false,\"composer\":false,\"genres\":[]}]}"
println(Json.decodeFromString<Artist>(jsonString))
}
Run Code Online (Sandbox Code Playgroud)
但我想做类似的事情
@Serializable
class Decomposed {
@Serializable
class DecomposedClassValue(val value: DecomposedClass)
@Serializable
class StringValue(val value: String)
}
@Serializable
data class DecomposedClass(
val id: Long? = null,
val name: String? = null,
val various: Boolean? = null,
val composer: Boolean? = null,
val genres: JsonArray? = null
)
@Serializable
data class Artist(
val decomposed: List<Decomposed>
)
fun …Run Code Online (Sandbox Code Playgroud) 我有一个 Json 输入,例如:
\n{\n "type": "type_1",\n "data": {\n // ...\n }\n}\nRun Code Online (Sandbox Code Playgroud)\ndata字段可能会有所不同,具体取决于type。
所以,我需要一个反序列化器,它分别查看type(enum) 和反序列化data(例如,对于type_1值它是Type1类,对于type_2\xe2\x80\x94Type2等)。
我考虑过一个完全自定义的反序列化器(扩展 a KSerializer<T>),但它看起来有点矫枉过正。
进行此类反序列化的最佳(kotlin)方法是什么?
\n我的重新序列化为 "{"2":"Hello","Tesst":"Value"}"
我尝试将此字符串解析为 Map<String,String>
val resialized = readFile(createStorageDirectoryPath(getManifestFilePath()), MANIFEST_FILE_NAME, errorOut)
manifest = Json.decodeFromString(/*serializer*/, resialized)
Run Code Online (Sandbox Code Playgroud)
如何为 Map<String,String> 创建序列化程序
I\xe2\x80\x99m 尝试实现在排除所有内部对象的情况下从序列化中排除整个对象的功能。
\n例如当我想将此数据类序列化为 json 时
\ndata class Car(val engine: Engine? = null, val size: Size? = null)\ndata class Engine(val type: String? = null, val horsePower: Int? = null)\ndata class Size(val size: Int? = null)\n\nCar(engine = Engine(horsePower = null), size = Size(size = 1000))\nRun Code Online (Sandbox Code Playgroud)\n那么我应该得到以下输出(即使设置了引擎也被排除)
\ncar {\n size {\n size = 1000\n }\n}\nRun Code Online (Sandbox Code Playgroud)\n有谁对如何实现这一目标有任何建议吗?
\n我需要使用映射序列化一个类,以便映射中的键在 json 中排序。所以如果有课的话
@Serializable
class Example(val map: Map<String, Int>)
Run Code Online (Sandbox Code Playgroud)
它是连载的
val example = Example(mapOf("b" to 2, "a" to 1, "c" to 3))
println(Json.encodeToString(example))
Run Code Online (Sandbox Code Playgroud)
那么生成的 json 应该是
{
"map": {
"a": 1,
"b": 2,
"c": 3
}
}
Run Code Online (Sandbox Code Playgroud)
我尝试使用SortedMap而不是Map,但这会引发异常:
kotlinx.serialization.SerializationException:类“TreeMap”未在“SortedMap”范围内注册多态序列化
如何使用 获得排序后的 json kotlinx.serialization?
(kotlin 1.4.0、kotlinx.serialization 1.0.0-RC)
我的 build.gradle.kts 启动如下:
...
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
plugins {
...
kotlin("jvm") //target version is java 11
kotlin("plugin.serialization") version "1.6.21"
}
Run Code Online (Sandbox Code Playgroud)
当我尝试将 kotlin 序列化插件更新到最新的1.7.10 版本时,出现以下编译错误:
A problem occurred configuring project ':my-little-project'.
> Failed to notify project evaluation listener.
> org.jetbrains.kotlin.gradle.plugin.KotlinGradleSubplugin: org.jetbrains.kotlinx.serialization.gradle.SerializationGradleSubplugin not a subtype
> org.jetbrains.kotlin.gradle.plugin.KotlinGradleSubplugin: org.jetbrains.kotlinx.serialization.gradle.SerializationGradleSubplugin not a subtype
Run Code Online (Sandbox Code Playgroud)
我该如何解决?谢谢!
堆栈跟踪(太大而无法完全发布,更多信息请询问):
Exception is:
org.gradle.api.ProjectConfigurationException: A problem occurred configuring project ':my-little-project'.
at org.gradle.configuration.project.LifecycleProjectEvaluator.wrapException(LifecycleProjectEvaluator.java:75)
at org.gradle.configuration.project.LifecycleProjectEvaluator.addConfigurationFailure(LifecycleProjectEvaluator.java:68)
at org.gradle.configuration.project.LifecycleProjectEvaluator.access$400(LifecycleProjectEvaluator.java:51)
...
Caused by: org.gradle.internal.event.ListenerNotificationException: Failed to notify project evaluation listener.
at org.gradle.internal.event.AbstractBroadcastDispatch.dispatch(AbstractBroadcastDispatch.java:89)
at …Run Code Online (Sandbox Code Playgroud)