Java 反序列化可以是整数或字符串的值

Java 反序列化可以是整数或字符串的值,java,json,gson,Java,Json,Gson,我正在使用一个遗留系统,该系统可以具有JSON,可以是: {"gauge": 1.0} // or {"gauge": "1.0-2.0"} 也就是说,量表可以是整数或字符串。我希望能够对同一类型的值进行序列化和反序列化 起初,我认为我可以简单地为此创建一个适配器: public class Capabilities { private Range gauge; } public class Range { private int value; private String r

我正在使用一个遗留系统,该系统可以具有JSON,可以是:

{"gauge": 1.0}
// or
{"gauge": "1.0-2.0"}
也就是说,量表可以是整数或字符串。我希望能够对同一类型的值进行序列化和反序列化

起初,我认为我可以简单地为此创建一个适配器:

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值创建范围

但是,当我运行gson.fromJsonstr时,我得到的Capabilities.class是:

应为BEGIN_对象,但为字符串

我已经确定这是因为str中gauge的值是用双引号括起来的,gauge应该是一个范围或字符串以外的任何东西,这意味着它期望它是一个对象


有没有任何方法可以让Gson为特定的类指定一个字符串?此外,有没有更好的方法来处理基元类型中可能存在的差异?

我不知道Gson API是否提供了这样做的方法,但一个选项是尝试一个转换,如果失败,则尝试第二个转换。 我要说的是有一个GaugeInt类,它将gauge作为int字段。还有另一个类GaugeString,它将gauge作为字符串字段。现在我们可以尝试使用GaugeInt.class进行第一次转换;如果这导致异常,我们将尝试使用GaugeInt.class进行第二次转换

因此,通过调用isRange,您将发现它是1.0还是1.0-2.0, 基于此,你可以

调用getValue

或getValue和getSecondValue

如果是range,则返回第二个int,如果不是range,则返回-1或选择其他数字来标识此情况

不需要其他适配器


希望这对您有所帮助。

您有权访问和控制bean POJO源代码类吗?如果是,我可以建议使用测量仪进行回答getter@Yazan我不太熟悉Java,也不知道bean POJO源代码类是什么意思,但我创建了功能、范围、RangeTypeAdapter,这个类正在执行gson.fromJSONBybean或POJO,我是说这个类将被用来使用gson序列化或反序列化JSON,不管怎样,我发布了一个答案:希望它能有所帮助you@YazanRangeTypeAdapter not posted实现序列化/反序列化,但非常简单。反序列化尝试首先获取int,如果出现异常,则获取字符串。序列化只是基于对isRange的检查创建一个JsonElement。好的,我知道了,也许您在RangeTypeAdapter中的内容与我在回答中发布的内容类似。这需要多次运行.fromJson?我理解你的建议,但是有比gauge更多的值可以做到这一点,所以我必须创建很多类来处理原语,比如Capabilities with GaugeIntWidthintAlloyint,Capabilities with GaugeStringWidthintAlloyint,等等。感谢你对适配器的建议,但这不是问题所在。问题是Gson似乎不允许您为原语指定自己的类。它要求JSON具有一个将使用自定义类的对象。
private String gauge = "";

public boolean isRange(){
      return (gauge.indexOf("-")>-1);
}

public int getValue(){
    if(isRange()){
        return Integer.parseInt(gauge.split("-")[0]);
    }else{
        return Integer.parseInt(gauge);
    }
}

public int getSecondValue(){
    if(isRange()){
        return Integer.parseInt(gauge.split("-")[1]);
    }else{
        return -1;
    }
}