在fastxml中,响应类型的更改是否有任何注释可以忽略?

时间:2019-05-29 09:58:50

标签: android kotlin jackson

我有一个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”之类的注释?


我认为“任何”类型都可以解决。 但这是最后的解决方案... 我想找到一个更聪明的解决方案。

1 个答案:

答案 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()
            }
        }
}