小编elc*_*lto的帖子

如何使用Gson反序列化继承的Kotlin数据类

在Android应用程序中,我需要使用单个抽象级别对Kotlin数据类的Json数据进行反序列化.但我不知道在构造函数中放置正确的属性.

作为一个简单的版本,让我说我有一个形状:

abstract class Shape(open val x: Int, open val y: Int)
Run Code Online (Sandbox Code Playgroud)

有两个推导

data class Circle(val radius: Int, override val x: Int, override val y: Int): Shape(x, y)
Run Code Online (Sandbox Code Playgroud)

data class Square(val width: Int, override val x: Int, override val y: Int): Shape(x, y)
Run Code Online (Sandbox Code Playgroud)

所以我的目标是,不要实例化一个Shape.因此,请始终反序列化其派生.后来我需要在其他类中处理一些集合属性,例如:

val shapes: List<Shape>
Run Code Online (Sandbox Code Playgroud)

但我还必须知道每个元素的派生类型.

当我尝试用Gson反序列化给定的例子时

val square = gson.fromJson(SQUARE_JSON, Square::class.java)
Run Code Online (Sandbox Code Playgroud)

我总是得到一个IllegalArgumentException

java.lang.IllegalArgumentException: class com.example.shapes.model.Square declares multiple JSON fields named x

at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:170)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:100)
at com.google.gson.Gson.getAdapter(Gson.java:423)
at com.google.gson.Gson.fromJson(Gson.java:886)
at com.google.gson.Gson.fromJson(Gson.java:852)
at com.google.gson.Gson.fromJson(Gson.java:801)
at com.google.gson.Gson.fromJson(Gson.java:773)
Run Code Online (Sandbox Code Playgroud)

是否有可能在不编写自定义Gson …

inheritance json gson kotlin data-class

8
推荐指数
2
解决办法
3974
查看次数

作为 Gradle 项目集成到 Android 应用程序中时,KMM 项目上缺少公共类

我有一个现有的 Android 应用程序,我喜欢将 KMM 库项目集成为 git 子模块。我们希望在本地构建上集成 git 子模块,并在 CI 构建上使用 Maven 存储库依赖项。

settings.gradle为了实现这一点,我在via中添加了子模块的目录includeBuild,并替换了特定模块的所有依赖项:

includeBuild('my-kmm-library-project') {
    dependencySubstitution {
        substitute module('com.example.any-kmm-artifact:any') using project(':any')
    }
}
Run Code Online (Sandbox Code Playgroud)

添加

implementation 'com.example.any-kmm-artifact:any:1.0.0'
Run Code Online (Sandbox Code Playgroud)

我的应用程序build.gradle文件允许访问 android 源集中子模块中的所有类和包/my-kmm-library-project/any/src/androidMain。但我无法选择从源集中导入“类” commonMain。我已经尝试让androidMain依赖commonMain.

kmm/build.gradle.kts:

includeBuild('my-kmm-library-project') {
    dependencySubstitution {
        substitute module('com.example.any-kmm-artifact:any') using project(':any')
    }
}
Run Code Online (Sandbox Code Playgroud)

这不会带来任何成功。

我还尝试jvm()在 KMM 项目上添加一个目标并让jvmMain依赖androidMain,但这会产生编译错误,导致 Android SDK 类无法解析。

我认为主要问题是,这些类只是编译到可以组装的aar中。但该模块被集成为 gradle 项目实现。

是否有 KMM 选项来编译“公共类”并通过 gradle 模块访问它们?

android gradle git-submodules kotlin-multiplatform kmm

6
推荐指数
0
解决办法
1043
查看次数