我正在尝试使用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;
}
}
答案 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且精确。