2016-08-04 27 views
1

jsonドキュメントを使用して変数型を宣言しようとしています... 問題は、Long型またはDouble型を宣言する必要があることです。例えば、文字列:変数型を文字列で宣言する方法

生の値は、二重である:

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

、これはあまりにも二重である:

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

が、これは長いです:

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

私は種類を知ることができますが、私が得たprobleは、私はこれをやろうとしている

タイプを宣言した瞬間にあるが、そこにあるので、私は「FMT」フィールドに正規表現を使用していますエラーと私は正確になぜそれを知りません。

これは私の「フィールド」クラスです:

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; 
    } 
} 
+0

Number(基本クラス)またはBigDecimal(すべての強力なスイスナイフ)を使用します。 –

+0

私はあなたがいないと思う...私にあなたの解決策を教えてもらえますか?ありがとうございました。 –

答えて

1

Eはロングまたはダブルのいずれかであることのための一般的なクラスRawField<E extends Number>が原因のタイプで、厄介です消去。

だから、基本型、Number、または1において、全てのいずれかの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が精度を有することによって二重に勝る利点を有するであろう:new BigDecimal("3.14") 2の精度を有し、正確です。

関連する問題