如何处理Kotlin的空座位?

时间:2016-06-02 07:42:03

标签: json gson kotlin

在java中我们可以执行以下操作

class A{
  int id;
  String name;

  public A(){}
  public A(int id, String name){
    this.id = id;
    this.name = name;
  }
  // getter/ setter
}

然后我可以创建一个新的Object并获得json,如下所示

A a= new A()
a.setName("test")

System.out.println(new Gson().toJson(a))

给我结果

{"name":"test"}

在kotlin,我怎么能做到这一点?

我面临的问题是kotlin说原始类型必须被初始化。所以在json中我得到idname;我不想要

那怎么办?

2 个答案:

答案 0 :(得分:6)

Kotlint会对null safety seriously进行处理,因此您必须明确初始化值。您的示例可以转换为:

class A(var id: Int? = null, var name: String? = null)

请注意,上述内容同时包含default argumentsparameterless constructor on the JVM。这是你写的:

val a = A()

以及:

val a = gson.fromJson(json, A::class.java)

答案 1 :(得分:1)

lateinit怎么样?

/* ***************************************************************************/
class A() {
  lateinit var id : Integer // Integer instead of Int due to lateinit's no-primitives requirement
  lateinit var name : String

  constructor(id : Integer, name : String) : this() {
    this.id = id
    this.name = name
  }
}
/* ***************************************************************************/

/* ***************************************************************************/
fun main(args: Array<String>) {
  val a = A()

  a.name = "test"

  assert(Gson().toJson(a) == """{"name":"test"}""")

  val aFromJson = Gson().fromJson("""{"name":"test"}""", A::class.java)

  assert(a.name == "test")
}
/* ***************************************************************************/

使用lateinit的优点是类内缺少可空属性,因此,您可以避免处理一堆空检查和?. derefering。