如何找到Gson生成的无效Kotlin对象(通过反射)?

时间:2018-12-17 14:51:21

标签: android json kotlin gson

{
  "data":[{"compulsory_field": 1}, {"compulsory_field": 2}, {}]
}

通过gson转换为对象

data class Something(val compulsory_field: Int)

val somethingList = //gson parse the data
println(somethingList)

//[
//    Something(compulsory_field = 1),
//    Something(compulsory_field = 2),
//    Something(compulsory_field = null)    //Should not exists
//]

,我想摆脱第三项。将其转换为对象之后,是否可以这样做?还是只能在String / InputStream时完成?我该怎么办?

谢谢!

编辑:澄清构造函数的作用,但是gson无法理解kotlin规则并注入了我无法在Kotlin中检查的对象

2 个答案:

答案 0 :(得分:0)

如果您不喜欢空的物体,则将其移除。解析后,您应该总是可以做到的。但是请注意,在Kotlin中,列表是可变的还是不可变的。如果您收到一个不变的列表(使用“ listOf”构建),则必须构建一个仅包含所需元素的新列表。

https://kotlinlang.org/docs/reference/collections.html

编辑:好的,我知道您甚至无法解析json。在这种情况下,您可以尝试以下方法:

  1. 要允许空值:将compulsory_field的类型从Int更改为Int?声明时
  2. 在解析之前固定您的json字符串:您可以将所有{}替换为{“ compulsory_field”:null}
  3. 现在,gson解析器应获取有效列表。

答案 1 :(得分:0)

我想出了一个难看的“解决方案” /解决方法,但我仍在寻找更好的答案(或者让项目切换到moshi codegen或其他,以先到者为准)

基本上,我只是再次复制每个对象,以确保它通过了kotlin提供的所有null安全检查

val somethingList = //gson parse the data
val fixedSomethingList = somethingList.mapNotNull {
    try {
    it.copy(compulsory_field = it.compulsory_field)
  } catch (e: IllegalArgumentException) { //if gson inserted a null to a non-null field, this will make it surface
    null  //set it to null so that they can be remove by mapNotNull above
  }
}

现在fixedSomethingList应该干净。再次,非常hacky,但是可以用……