我正在使用可以具有如下所示的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


我已经确定这是因为gaugestr的值是用双引号引起来的,而gauge应该是RangeString以外的任何其他事实意味着它期望它是一个对象。

有什么方法可以期望Gson期望特定类的STRING吗?此外,有没有更好的方法来处理原始类型中可能存在的差异?

最佳答案

我不知道Gson API是否提供了一种方法来执行此操作,但是可以选择尝试一次转换,如果失败,则尝试第二次转换。
我的意思是要有一个GaugeInt类,该类具有gauge作为int字段。还有另一个类GaugeString,该类具有gauge作为String字段。现在我们可以尝试使用GaugeInt.class进行第一次转换;如果这导致异常,我们将尝试使用GaugeInt.class进行第二次转换。

07-24 09:51
查看更多