我正在使用可以具有如下所示的JSON的旧式系统:
{"gauge": 1.0}
// or
{"gauge": "1.0-2.0"}
也就是说
gauge
可以是整数或字符串。我希望能够序列化和反序列化同一类型的值。一开始,我认为我可以为此简单地创建一个适配器:
public class Capabilities {
private Range gauge;
}
public class Range {
private int value;
private String range;
private boolean isRange;
public Range(int value) {
this.value = value;
this.isRange = false;
}
public Range(String value) {
this.range = range;
this.isRange = true;
}
public boolean isRange() {
return this.isRange;
}
public int getValue() {
return this.value;
}
public String getRange() {
return this.range;
}
}
然后,我有
RangeTypeAdapter
,它使用适当的int / String值创建了Range
。但是,当我运行
gson.fromJson(str, Capabilities.class)
时,我得到:Expected BEGIN_OBJECT but was STRING
我已经确定这是因为
gauge
中str
的值是用双引号引起来的,而gauge
应该是Range
或String
以外的任何其他事实意味着它期望它是一个对象。有什么方法可以期望Gson期望特定类的
STRING
吗?此外,有没有更好的方法来处理原始类型中可能存在的差异? 最佳答案
我不知道Gson API是否提供了一种方法来执行此操作,但是可以选择尝试一次转换,如果失败,则尝试第二次转换。
我的意思是要有一个GaugeInt
类,该类具有gauge
作为int
字段。还有另一个类GaugeString
,该类具有gauge
作为String
字段。现在我们可以尝试使用GaugeInt.class
进行第一次转换;如果这导致异常,我们将尝试使用GaugeInt.class
进行第二次转换。