2017-07-07 85 views
1

我存儲在MySQL數據庫非常低的值,這樣的事情:BIGDECIMAL低值

0.00000070 
0.00000097 

我使用的彈簧引導到服務於這個值作爲一個REST API,我的模型映射是這樣的:

public class Account extends BaseEntity { 

    @Column(name = "VALUATION", precision = 15, scale = 8) 
    @JsonView({ ViewsUtil.Ticker.class, ViewsUtil.Chart.class }) 
    @Setter @Getter 
    private BigDecimal valuation; 

    // others fields 

在db它存儲正確,就像我出現了,但是顯示,它顯示就像這樣:

{ 
    "valuation": 9.7e-7 
} 

釷ere的顯示方式就像它存儲的一樣?

感謝

----編輯

改變了我的模型,這個

@Column(name = "VALUATION", precision = 15, scale = 8) 
    @JsonView({ ViewsUtil.Ticker.class, ViewsUtil.Chart.class }) 
    @JsonDeserialize(using = LowValueDeserializer.class) 
    @Setter @Getter 
    private BigDecimal valuation; 

而且我的自定義解串器是這樣的:

@JsonComponent 
public class LowValueDeserializer extends JsonDeserializer<String> { 

    @Override 
    public String deserialize(JsonParser parser, DeserializationContext context) throws IOException, JsonProcessingException { 
     System.out.println(parser.getDecimalValue()); 

     return parser.getDecimalValue().toPlainString(); 
    } 
} 

系統從來就不是調用結果仍然相同。

+1

請參閱https://github.com/FasterXML/jackson-databind/wiki/Serialization-features:查找WRITE_BIGDECIMAL_AS_PLAIN –

+0

您想格式化BigDecimal以進行顯示。即使您想要的格式不同於重複文章中使用的格式,也是重複的。 – DwB

+0

@DwB在'.toPlainString()'的重複中使用'String.format()'有什麼好處嗎?對於OP所需要的應該更好 – baao

回答

0

更新: 作爲JB Nizet說,在他的評論,您必須使用:

WRITE_BIGDECIMAL_AS_PLAIN

由於傑克遜2.2WRITE_BIGDECIMAL_AS_PLAIN可用下Datatype-特定序列號默認設爲false

你可以將它與方法enable()ObjectMapper設置爲true,如下所示:

ObjectMapper mapper = new ObjectMapper().enable(SerializationFeature.WRITE_BIGDECIMAL_AS_PLAIN); 

在點你轉換的BigDecimal字符串,則必須使用.toPlainString()方法,如下所示:

String theWholeNumber = YourBigDecimalNumber.toPlainString(); 

我認爲你的問題是,在你的JSON字符串中的值與指數一起顯示。我認爲這不是問題,因爲你在客戶端和服務器端使用相同的模型(希望)。如果你想使用它,沒有必要改變格式。只有如果你想顯示它,你需要將其轉換爲字符串.toPlainString()方法。

+0

是的,我試過這個,使用@JsonDeserialize,但該方法從未被調用 – c0nf1ck

+0

編輯我的帖子,並添加我說的代碼 – c0nf1ck