2016-10-24 9 views
3

私は、ジャクソンが予測できない任意の型に数値を逆シリアル化するという問題があります。たとえば、誰かが値「14」を渡すと、jacksonはそれをIntegerとしてインスタンス化します。しかし、誰かが値「14.01」を渡すと、jacksonはそれをDoubleとしてインスタンス化します。これは問題です。カスタムのデシリアライザ(@JsonCreator)が例外をスローしているため、フィールドをBigDecimalにキャストできないためです。理想的には、jacksonはすべてをBigDecimalに変換します。BigDecimalを使用するように強制するスプリングブートのジャックソンデシリアライザ

私はジャクソンがこのようなことをする可能性があることを示唆する投稿を見つけました。 Deserialize JSON into a generic map, forcing all JSON floats into Decimal or String, in Jackson

しかし、適切なメソッドmapper.enable()を実行するために、Springブート内に隠れているマッパーオブジェクトにアクセスする方法を理解できません。あなたはジャクソンが時々ダブルスで供給していないので、Doubleキャストが問題であることを、上記の見ることができるように

@JsonCreator 
public OptionTransaction(Map<String,Object> jsonObj){ 
    Map<String,Object> jsonOption = (Map<String, Object>) jsonObj.get("option"); 

    Map<String,Object> optionPriceObj = (Map<String, Object>) jsonOption.get("price"); 
    BigDecimal optionValue = new BigDecimal((Double) optionPriceObj.get("value")); 

:ここ

は、デシリアライザの抜粋です。 jacksonにBigDecimals、あるいは単に文字列を出力させる簡単な方法を知っている人はいますか?

UPDATE:取得ダブルスのBigDecimalに変換する限り、私は次のようにapplication.propertiesを変更することによって、これを達成

# =============================== 
# = DESERIALIZATION CUSTOMIZATION 
# =============================== 
spring.jackson.deserialization.USE_BIG_DECIMAL_FOR_FLOATS=true 
+0

なぜあなたはSpringマッパーにアクセスする必要がありますか?自分で作成してみませんか? –

+0

私の質問への答えはそれを含むかもしれませんが、それは完全に質問に答えることはできません。私自身のマッパを作成する場合、どのように春のブートを使用してそれを使用するのですか? – melchoir55

答えて

4
@JsonCreator 
public OptionTransaction(Map<String,Object> jsonObj){ 
    Map<String,Object> jsonOption = (Map<String, Object>) jsonObj.get("option"); 

    Map<String,Object> optionPriceObj = (Map<String, Object>) jsonOption.get("price"); 
    BigDecimal optionValue = new BigDecimal((Double) optionPriceObj.get("value")); 
} 

..

ObjectMapper mapper = new ObjectMapper(); 
mapper.enable(DeserializationFeature.USE_BIG_DECIMAL_FOR_FLOATS); 

OptionTransaction transaction = mapper.readValue(jsonString, OptionTransaction.class); 

https://github.com/FasterXML/jackson-databind/wiki/Deserialization-Features

+0

私は将来のデシリアライゼーションの試みにこのマッパを使用し始めるためにspingブートを取得する方法についても説明しなければならないと答えていると印を付けると思います。それも可能ですか?たとえば、@RequestBodyオブジェクトobjを使用するすべてのエンドポイントは、このマッパーでデシリアライズする必要があります。 – melchoir55

関連する問題