我试图将一些数据类公开为 JSON 对象,但有些东西不起作用。
我有以下数据类:
data class Link(
@JsonProperty("rel")
@JsonView(View.Bind::class)
val rel: String,
@JsonProperty("method")
@JsonView(View.Bind::class)
val method: HttpMethod,
@JsonProperty("href")
@JsonView(View.Bind::class)
val href: String)
data class MetaData(val status: HttpStatus) {
@JsonView(View.Bind::class)
@JsonProperty("status_code")
fun getStatusCode(): Int {
return status.value()
}
@JsonView(View.Bind::class)
@JsonProperty("status_desc")
fun getStatusDesc(): String {
return status.name
}
}
data class Payload(
@JsonView(View.Bind::class)
@JsonProperty("payload")
val payload: Any,
@JsonProperty("_meta")
@JsonView(View.Bind::class)
val metaData: MetaData,
@JsonProperty("_links")
@JsonView(View.Bind::class)
val links: List<Link>)
Run Code Online (Sandbox Code Playgroud)
出于某种原因,当 Payload 类是 JAVA 类时,一切正常,但当它是 kotlin 类时,只有有效负载元素进入 JSON。
对于依赖,我正在使用:
<dependency>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-stdlib</artifactId>
<version>1.0.1-1</version>
</dependency>
<dependency> …Run Code Online (Sandbox Code Playgroud) 我有一个数据类定义如下
package com.mypackage.model
object Model {
data class News(val photo: String, val title: String, val description: String)
}
Run Code Online (Sandbox Code Playgroud)
当我使用Proguard(即发布版本)编译它时,我收到并存储在模型中的数据全部变为空。它们仍然在那里,即 ArrayList listOfNews 确实具有预期的检索大小。然而它们的所有内容都是空的。
调试构建这是可以的。为了解决这个问题,我使用了这个混淆规则,它解决了这个问题。
-keep class com.mypackage.model.** { *; }
Run Code Online (Sandbox Code Playgroud)
这是预期的吗?即所有数据类都应该受到保护?
最近我开始将我的 Android 项目从 Java 转换为 Kotlin。我在许多类中使用 Retrofit 从 API 获取数据。在我的项目中,有很多 POJO,我需要手动将它们转换为数据类,因为它与 Android Studio 的自动转换工具不能很好地配合。
考虑我有模型类:
public class LoginResponseMinimal {
String firstName, lastName, token;
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public String getToken() {
return token;
}
public void setToken(String token) {
this.token = token;
}
}
Run Code Online (Sandbox Code Playgroud)
有什么好方法可以直接将这个模型类转换为 Kotlin 中的数据类吗?这个类手动转换是可以的,但是我有一些类有大量变量,手动将其转换为数据类会很麻烦。
嗨我有一个Kotlin数据类如下
data class User (
@get:Exclude val gUser: Boolean,
@get:Exclude val uid: String,
@get:PropertyName("display_name") val displayName: String,
@get:PropertyName("email") val email: String,
@get:PropertyName("account_picture_url") val accountPicUrl: String,
@get:PropertyName("provider") val provider: String
)
Run Code Online (Sandbox Code Playgroud)
我能够没有问题地序列化对象.但是在执行firebase查询时,我无法反序列化对象.目前这是我正在做的获取数据
_firebaseReference.child(getString(R.string.firebase_users_key)).child(user.uid)
.setValue(user).addOnCompleteListener{
_firebaseReference.child("users").child(user.uid)
.addListenerForSingleValueEvent(object : ValueEventListener {
override fun onCancelled(p0: DatabaseError) {
}
override fun onDataChange(p0: DataSnapshot) {
if (p0.exists()) {
val userHash = p0.value as HashMap<*, *>
var currentUser: User
if (userHash[getString(R.string.provider_key)]
!= getString(R.string.provider_google)) {
currentUser = User(false, p0.key!!,
userHash["display_name"].toString(),
userHash["email"].toString(),
userHash["account_picture_url"].toString(),
userHash["provider"].toString())
} else {
currentUser = …Run Code Online (Sandbox Code Playgroud) 我能够找到将 Java 的 POJO 列表导出到 csv 的方法,但找不到将 Kotlin 的数据类列表导出到 CSV 的方法。
我有一个像这样的密封类:
sealed class SealedClass {
object Object1 : SealedClass()
object Object2 : SealedClass()
object Object3 : SealedClass()
data class DataClass(val sealedClass: SealedClass, val anotherDataType: AnotherDataType? = null)
}
Run Code Online (Sandbox Code Playgroud)
我想在 Bundle 中传递我的数据类,就像我们通常将值传递给一个新片段一样,如下所示:
@JvmStatic
fun newInstance(dataClass: DataClass): Fragment {
val fragment = Fragment()
val args = Bundle(1)
args.putParcelable("DATA_CLASS", dataClass)
fragment.arguments = args
return fragment
}
Run Code Online (Sandbox Code Playgroud)
我不知道该怎么做。到目前为止,我读到的是人们使用@Parcelize注释,这是我试图避免的 Kotlin 的一个实验性功能。另一种方法是通过 Parcelable 扩展数据类并实现 Parcelable 方法,但由于我使用自定义类作为 DataClass 中的参数(例如 SealedClass),我不知道如何在 Parcelable 实现中读取/写入这些值。这不是一个正确的方法吗?
有没有办法在 Kotlin 接口中使用 gson SerializedName 注释?
interface User {
@SerializedName("user_id")
val userId: String?
}
data class MainUser(override val userId: String? = null) : User
Run Code Online (Sandbox Code Playgroud)
我知道注释可以在子类中,但这不是我要找的,因为有很多类扩展了该接口。
注 1: 使用抽象类或开放类作为数据类的父类可以解决这个问题,但新问题是父类中覆盖的 equals() 方法永远不会被调用(mainUser1 == mainUser2 从不检查 equls() 方法抽象或开放类用户)
我认为我在这里缺少 Jetpack Compose 的核心概念。non-constructor data class property当我尝试更改可组合项的内部且此可组合项是观察列表的一部分时,我遇到了问题。
不起作用:(sadProperty未在构造函数中声明)
data class IntWrapper(val actualInt: Int = 0) {
var sadProperty: Int = 0
}
@Preview
@Composable
fun test() {
var state by remember { mutableStateOf(listOf(IntWrapper(1), IntWrapper(2), IntWrapper(3),IntWrapper(4)))}
fun onClick(item: IntWrapper) {
val indexOf = state.indexOf(item)
val newState = state.minus(item).toMutableList()
val copy = item.copy()
copy.sadProperty = Random.nextInt()
newState.add(indexOf, copy)
state = newState
}
Column() {
for (item in state) {
Text("ac: ${item.actualInt} sad: ${item.sadProperty}", modifier = Modifier.clickable { onClick(item)}) …Run Code Online (Sandbox Code Playgroud) android kotlin data-class android-jetpack-compose compose-recomposition
也许我误解copy了data类的功能是如何工作的,或者可能存在错误,但以下是copy函数不能按预期工作的示例:
科特林:
data class A {
public var x: String? = null
public var y: String? = null
public var z: B = B.ONE
}
enum class B {
ONE
TWO
THREE
}
Run Code Online (Sandbox Code Playgroud)
Java的
A a1 = new A()
a1.setX("Hello")
a1.setY("World")
a1.setZ(B.TWO)
A a2 = a1.copy()
// a2.x is null
// a2.y is null
// a2.z is B.ONE
Run Code Online (Sandbox Code Playgroud)
它似乎copy只是创建一个新的实例A而不是复制值.如果我将变量放在构造函数中,则会分配值,但这与构造新实例没有什么不同.
我有一个 Worker 数据类,
data class Worker(val id: Int, val name:String, val gender :String, val age :Int, val tel:String,val email:String)
Run Code Online (Sandbox Code Playgroud)
和工人名单
List<Worker> = listOf(workerA, workerB)
Run Code Online (Sandbox Code Playgroud)
我想写一个函数来更新Worker的数据,例如:
updateWorkerData(1, age, 28)
//'type' refer to name, gender, age ..
//'value' refer AA, Female, 27 ..
fun updateWorkerData(id: Int, type: Any, value: Any) {
val workers = getListOfWorker()
workers.forEach {
if (it.id == id) {
//here is where I stuck
}
}
}
Run Code Online (Sandbox Code Playgroud)
我被困在如何将类型引用到数据类 Worker 中的值上。需要一些有关如何更新工人数据的指南。谢谢。
data-class ×10
kotlin ×10
android ×6
csv ×1
firebase ×1
gson ×1
interface ×1
jackson ×1
java ×1
json ×1
pojo ×1
proguard ×1
sealed-class ×1
spring-mvc ×1