如何在Kotlin中处理伪字符串中的坏字符串?

时间:2018-04-02 17:08:04

标签: kotlin gson

让我们说我正在使用gson将json序列化和反序列化为Kotlin数据类。其中一个值是字符串设置为"是"或"不"另一个字符串设置为" on"或"关闭"。是的,这是一种可怕的糟糕做法,但我们假设它无法改变。

什么是在Kotlin处理此问题的最佳方式?

APIdata.json

{
   "value" : "On",
   "anotherValue" : "Yes"
}

APIdata.kt

data class APIdata (val value : String, val anotherValue: String)

为了获取和设置,我希望能够将它们都视为布尔值。

2 个答案:

答案 0 :(得分:0)

您可以使用映射函数和相应的构造函数,也可以定义get方法:

data class APIdata(val value: String, val anotherValue: String) {
    fun mapToBoolean(string: String) =
        when (string.toLowerCase()) {
            "yes" -> true
            "on"  -> true
            else  -> false
        }

    constructor(value: Boolean, anotherValue: Boolean) :
        this(if (value) "on" else "off", if (anotherValue) "yes" else "no")

    fun getValue(): Boolean {
        return mapToBoolean(value)
    }


    fun getAnotherValue(): Boolean {
        return mapToBoolean(anotherValue)
    }
}

在这种情况下,使用data class可能会产生误导,因为Kotlin编译器生成hashCodeequals假设valueanotherValue为{{1}而不是String。更好的设计是自己实现它们:

Boolean

答案 1 :(得分:0)

您需要使用TypeAdapter

class ApiDataTypeAdapter: TypeAdapter<APIData>() {

  override fun read(`in`: JsonReader) {
    var valOne = false
    var valTwo = false

    `in`.beginObject()
    while (`in`.hasNext()) {
        when(`in`.nextName()) {
          "val" -> valOne = `in`.nextString() == "On"
          "anotherVal" -> valTwo = `in`.nextString() == "Yes"
    }
    `in`.endObject()

    return APIData(valOne, valTwo)
  }

  override fun write(out: JsonWriter, apiData: APIData)
  {
    out.beginObject()
    out.name("val").value(if (apiData.`val`) "On" else "Off")
    out.name("anotherVal").value(if (apiData.anotherVal) "Yes" else "No")
    out.endObject()
  }
}

然后将其注册到您的APIData类:

val builder = GsonBuilder()
builder.registerTypeAdapter(APIData::class.java, ApiDataTypeAdapter().nullSafe())
val gson = builder.create()