标签: kotlinx.serialization

使用外部 kotlinx 序列化器序列化列表

所以,我有这个类 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)

kotlin kotlinx.serialization

4
推荐指数
1
解决办法
2162
查看次数

Ktor HttpClient JsonFeature 可以使用 kotlinx.serialization

Ktor 的 HttpClient 允许安装 Json 功能。有谁知道这个功能是否可以使用kotlinx.serialization 库还是仅限于 Gson?我有兴趣为MPP项目启用 Json 功能。

kotlin ktor kotlinx.serialization

3
推荐指数
1
解决办法
4011
查看次数

kotlinx.serialization - 使用自定义 DateSerializer 将 ArrayList&lt;Date&gt; 序列化为数据类变量

我需要使用自定义 DateSerializer 将 ArrayList 序列化为数据类变量,我使用注释的单个日期变量:

@Serializable
      data class SearchBundle(
      @Serializable(with = DateSerializer::class) var startDate: Date? = null)
Run Code Online (Sandbox Code Playgroud)

有人知道如何处理日期数组吗?

serialization android kotlin kotlinx.serialization

3
推荐指数
1
解决办法
2098
查看次数

调用生成的 serializer() 方法时收到 NoClassDefFoundError

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)

kotlin kotlinx.serialization kotlinx

3
推荐指数
1
解决办法
839
查看次数

使用 kotlinx.serialization 库反序列化具有不同值类型的 JSON 数组

我正在尝试反序列化以下字符串:

 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)

serialization json kotlin kotlinx.serialization

3
推荐指数
1
解决办法
1398
查看次数

kotlinx 序列化 — 进行多态子反序列化的最佳方法

我有一个 Json 输入,例如:

\n
{\n   "type": "type_1",\n   "data": {\n      // ...\n   }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

data字段可能会有所不同,具体取决于type

\n

所以,我需要一个反序列化器,它分别查看type(enum) 和反序列化data(例如,对于type_1值它是Type1类,对于type_2\xe2\x80\x94Type2等)。

\n

我考虑过一个完全自定义的反序列化器(扩展 a KSerializer<T>),但它看起来有点矫枉过正。

\n

进行此类反序列化的最佳(kotlin)方法是什么?

\n

json kotlin kotlinx.serialization kotlinx

3
推荐指数
1
解决办法
1194
查看次数

将 Json 解析为 Map&lt;String,String&gt; kotlin 多平台

我的重新序列化为 "{"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> 创建序列化程序

kotlin kotlinx.serialization

3
推荐指数
1
解决办法
6987
查看次数

Kotlinx.Serialization:如果所有内部属性也被排除,则从序列化中排除对象

I\xe2\x80\x99m 尝试实现在排除所有内部对象的情况下从序列化中排除整个对象的功能。

\n

例如当我想将此数据类序列化为 json 时

\n
data 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))\n
Run Code Online (Sandbox Code Playgroud)\n

那么我应该得到以下输出(即使设置了引擎也被排除)

\n
car {\n    size {\n        size = 1000\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

有谁对如何实现这一目标有任何建议吗?

\n

json kotlin kotlinx.serialization

2
推荐指数
1
解决办法
4468
查看次数

按 kotlinx.serialization 生成的键排序的映射

我需要使用映射序列化一个类,以便映射中的键在 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)

kotlin kotlinx.serialization

2
推荐指数
1
解决办法
2998
查看次数

kotlin 序列化插件更新到 1.7.10 后 Gradle 失败

我的 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)

gradle kotlin kotlinx.serialization

2
推荐指数
1
解决办法
5041
查看次数