在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 …
我有一个现有的 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 模块访问它们?