如何通过字符串声明变量类型知道其类型

时间:2016-08-04 11:57:15

标签: java json string

我正在尝试使用json文档声明变量类型... 问题是我需要声明它的类型为Long或Double,这取决于字符串,例如:

原始值是双倍的:

{"raw":119970000,"fmt":"119.97M","longFmt":"119,970,000"}

这也是Double:

{"raw":0.068,"fmt":"6.80%"}

但这很长:

{"raw":1443571200,"fmt":"2015-09-30"}

我在“fmt”字段上使用正则表达式,所以我可以知道类型,但我得到的问题是在声明类型的时刻

我正在尝试这样做,但是有一个错误,我不确切地知道为什么。

这是我的“Field”类:

    public class Field {

      @JsonProperty("raw") private RawField raw;
      @JsonProperty("fmt") private String fmt;
      @JsonIgnore private FieldType fieldType;

      @JsonCreator
      public Field(
        @JsonProperty("raw") RawField raw,
        @JsonProperty("fmt") final String fmt
      ) {
        this.setFmt(fmt);
        this.setRaw(raw, fmt);
      }

      private boolean isDate(String fmt){
        Pattern datePattern = Pattern.compile(
          "[0-9]{4}-(([1][0-2])|(0[0-9]))-((0[1-9])|(1[0-9])|(2[0-9])|(3[0-1]))"
        );
        Matcher matcher = datePattern.matcher(fmt);
        return matcher.find();
      }

      private boolean isDouble(String fmt) {
        Pattern datePattern = Pattern.compile(
          "[0-9]+\\.?[0-9]*(M|B|%)?$"
        );
        Matcher matcher = datePattern.matcher(fmt);
        return !isDate(fmt) && matcher.find();
      }


      public String getFmt() {
        return fmt;
      }

      public void setFmt(final String fmt) {
        this.fmt = fmt;
      }

      public RawField getRaw() {
        return raw;
      }

      public void setRaw(final RawField raw) {
        this.raw = raw;
      }

      private void setRaw(final RawField raw, String fmt) {
        if(isDate(fmt)) {
          this.raw = new RawField<Long>(raw); //error
        } else {
          if(isDouble(fmt)){
            this.raw = new RawField<Double>(raw); //error
          }
        }


      }
    }

这是我的RawField类:

public class RawField <E> {

  @JsonProperty("raw") private E rawField;

  @JsonCreator
  public RawField (E rawField){
    this.setRawField(rawField);
  }

  @JsonProperty("raw")
  public void setRawField(E rawField) {
    this.rawField = rawField;
  }
  @JsonProperty("raw")
  public E getRawField() {
    return rawField;
  }
}

1 个答案:

答案 0 :(得分:1)

由于类型擦除,E的泛型类RawField<E extends Number>是Long或Double很麻烦。

所以我会使用基本类型Number或者一对一的BigDecimal

 Number raw;

 private void setRaw(final RawField raw, String fmt) {
    if(isDate(fmt)) {
      long t = ...
      this.raw = t;
    } else {
      if(isDouble(fmt)) {
        double x = .... 
        this.raw = x;
      }
    }
  }

  double y = field.raw.doubleValue();
  long n = field.raw.longValue();
  if (field.raw instanceof Double) { ... }

BigDecimal具有精度优于double的优势:new BigDecimal("3.14")精度为2且精确。