让我们说我正在使用gson将json序列化和反序列化为Kotlin数据类。其中一个值是字符串设置为"是"或"不"另一个字符串设置为" on"或"关闭"。是的,这是一种可怕的糟糕做法,但我们假设它无法改变。
什么是在Kotlin处理此问题的最佳方式?
APIdata.json
{
"value" : "On",
"anotherValue" : "Yes"
}
APIdata.kt
data class APIdata (val value : String, val anotherValue: String)
为了获取和设置,我希望能够将它们都视为布尔值。
答案 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编译器生成hashCode
和equals
假设value
和anotherValue
为{{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()