context: JsonDeserializationContext?): Int {if (json?.getAsString().equals("")) {return 0}try {return json!!.getAsInt()} catch (e: NumberFormatException) {return 0}
}
}
fun intDefault0(){
val jsonStr = “”"
{
“name”:“萧晓”,
“age”:""
}
“”".trimIndent()
val user = GsonBuilder()
.registerTypeAdapter(
Int::class.java,
IntDefaut0Adapter())
.create()
.fromJson(jsonStr,User::class.java)
Log.i(“cxmydev”,“user: ${user.toString()}”)
}
在 IntDefaut0Adapter 中,首先判断数据字符串是否为空字符串 `""`,如果是则直接返回 0,否则将其按 Int 类型解析。在这个例子中,将整型 0 作为一个异常参数进行处理。### 2.3 null、[]、List 转 List还有一些小伙伴比较关心的,对于 JSONObject 和 JSONArray 兼容的问题。例如需要返回一个 List,翻译成 JSON 数据就应该是方括号 `[]` 包裹的 JSONArray。但是在列表为空的时候,服务端返回的数据,什么情况都有可能。
{
“name”:“萧晓”,
“languages”:[“EN”,“CN”] // 理想的数据
// “languages”:""
// “languages”:null
// “languages”:{}
}
例子的 JSON 中,`languages` 字段表示当前用户所掌握的语言。当语言字段没有被设置的时候,服务端返回的数据不一致,如何兼容呢?我们在原本的 User 类中,增加一个 languages 的字段,类型为 ArrayList。
var languages = ArrayList()
在 Java 中,列表集合都会实现 List 接口,所以我们在实现 JsonDeserializer 的时候,解析拦截的应该是 List。在这个情况下,可以使用 JsonElement 的 `isJsonArray()` 方法,判断当前是否是一个合法的 JSONArray 的数组,一旦不正确,就直接返回一个空的集合即可。
class ArraySecurityAdap