我有一个Android应用程序(由Kotlin编写)。
它使用外部服务器,并且服务器提供XML作为响应。
上周,服务器响应已更改。 响应中添加了一个新元素。
所以我的应用程序崩溃了...
为解决此问题,我添加了一个注释:
@JsonIgnoreProperties(ignoreUnknown = true)
它工作正常。
但是我有一个问题。 如果服务器更改了响应数据类型,该如何处理? 例如,这是响应:
<?xml version="1.0" encoding="UTF-8"?>
<response>
<data>
<sessionid>hello</sessionid>
<endpoint>https://test.com</endpoint>
<id>123</id>
<pw>testpassword</pw>
</data>
</response>
现在,如果将“ pw”元素的类型更改为如下所示的“ Integer”,则会发生异常。
<?xml version="1.0" encoding="UTF-8"?>
<response>
<data>
<sessionid>hello</sessionid>
<endpoint>https://test.com</endpoint>
<id>123</id>
<pw>0000</pw> <!-- server response type is changed from String to Integer -->
</data>
</response>
Cannot deserialize value of type `java.lang.Integer` from String "pw": not a valid Integer value
我的应用程序将崩溃。
我想防止此类更改导致崩溃。 有什么好的解决办法吗?或“ @JsonIgnoreProperties”之类的注释?
我认为“任何”类型都可以解决。 但这是最后的解决方案... 我想找到一个更聪明的解决方案。
答案 0 :(得分:1)
是的,您可以为pw变量使用自定义的setter来强制类型:
distributionUrl=https\://services.gradle.org/distributions/gradle-5.1.1-all.zip
注意:如果无法通过toString方法将类型强制为字符串,这仍然会引发异常。
有关要使用自定义设置程序的数据类,请参见this example
class ResponseData(pw: String) {
var pw: String
set(value: Any) {
field = when(value) {
is String -> value
else -> value.toString()
}
}
}