61

現在、Jackson を使用して、Spring ベースの Web アプリケーションから JSON 結果を送信しています。

私が抱えている問題は、すべてのお金のフィールドを小数点以下 2 桁で出力しようとしていることです。setScale(2)25.50 のような数値は 25.5 などに切り捨てられるため、を使用してこの問題を解決できませんでした。

他の誰かがこの問題に対処しましたか? カスタム Jackson シリアライザーを使用して Money クラスを作成することを考えていました... フィールド変数用のカスタム シリアライザーを作成できますか? おそらくできます...しかし、それでも、顧客のシリアライザーに数値を小数点以下2桁の数値として追加させるにはどうすればよいですか?

4

7 に答える 7

84

money フィールドでカスタムシリアライザーを使用できます。MoneyBean の例を次に示します。フィールドamountには@JsonSerialize(using=...)の注釈が付けられます。

public class MoneyBean {
    //...

    @JsonProperty("amountOfMoney")
    @JsonSerialize(using = MoneySerializer.class)
    private BigDecimal amount;

    //getters/setters...
}

public class MoneySerializer extends JsonSerializer<BigDecimal> {
    @Override
    public void serialize(BigDecimal value, JsonGenerator jgen, SerializerProvider provider) throws IOException,
            JsonProcessingException {
        // put your desired money style here
        jgen.writeString(value.setScale(2, BigDecimal.ROUND_HALF_UP).toString());
    }
}

それでおしまい。BigDecimal が正しい方法で出力されるようになりました。簡単なテストケースを使用してそれを示しました。

@Test
public void jsonSerializationTest() throws Exception {
     MoneyBean m = new MoneyBean();
     m.setAmount(new BigDecimal("20.3"));

     ObjectMapper mapper = new ObjectMapper();
     assertEquals("{\"amountOfMoney\":\"20.30\"}", mapper.writeValueAsString(m));
}
于 2012-07-18T12:03:43.423 に答える
15

私はjackson-datatype-moneyのメンテナーの 1 人です。私は確かに偏見を持っているので、この回答は大目に見てください。モジュールはあなたのニーズをカバーする必要があり、かなり軽量です (追加のランタイム依存関係はありません)。さらに、Jackson docsSpring docsで言及されており、Jacksonの公式エコシステムに統合する方法についてすでにいくつかの議論さえありました。

于 2016-06-05T23:53:09.760 に答える
5

私は同じ問題を抱えていて、代わりに文字列として JSON にフォーマットしました。少しハックかもしれませんが、実装は簡単です。

private BigDecimal myValue = new BigDecimal("25.50");
...
public String getMyValue() {
    return myValue.setScale(2, BigDecimal.ROUND_HALF_UP).toString();
}
于 2012-08-15T11:11:35.220 に答える