2012-07-03 25 views
21

वर्तमान में मैं अपने स्प्रिंग-आधारित वेब एप्लिकेशन से जेएसओएन परिणाम भेजने के लिए जैक्सन का उपयोग कर रहा हूं।जावा से जैक्सन जेएसओएन क्रमबद्धता: मनी फ़ील्ड

समस्या जो मैं कर रहा हूं वह सभी दशमलव फ़ील्ड को 2 दशमलव स्थानों के साथ आउटपुट करने का प्रयास कर रहा है। मैं setScale (2) का उपयोग करके इस समस्या को हल करने में सक्षम नहीं था, क्योंकि 25.50 की संख्या 25.5 आदि को घटा दी गई है

क्या किसी और ने इस समस्या का सामना किया है? मैं एक कस्टम जैक्सन serializer के साथ एक मनी क्लास बनाने के बारे में सोच रहा था ... क्या आप एक फील्ड चर के लिए एक कस्टम serializer बना सकते हैं? आप शायद कर सकते हैं ... लेकिन फिर भी, मैं अपने ग्राहक धारावाहिक को संख्या को 2 दशमलव स्थानों के साथ संख्या जोड़ने के लिए कैसे प्राप्त कर सकता हूं?

+0

आप इन मानों को क्या संग्रहीत कर रहे हैं? एक 'BigDecimal'? –

+0

@ ग्रेगकोफ हां एक बिगडेसीमल – ControlAltDel

उत्तर

5

मेरे पास एक ही समस्या थी और मैंने इसे JSON में स्ट्रिंग के रूप में स्वरूपित किया था। एक हैक का थोड़ा सा हो सकता है लेकिन इसे कार्यान्वित करना आसान है।

private BigDecimal myValue = new BigDecimal("25.50"); 
... 
public String getMyValue() { 
    return myValue.setScale(2, BigDecimal.ROUND_HALF_UP).toString(); 
} 
40

आप अपने पैसे के क्षेत्र में एक कस्टम धारावाहिक का उपयोग कर सकते हैं। मनीबीन के साथ यहां एक उदाहरण दिया गया है। क्षेत्र राशि@JsonSerialize (= = ...) के साथ एनोटेटेड हो जाता है।

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)); 
} 
+1

अच्छा दृष्टिकोण, लेकिन यह इसे एक स्ट्रिंग के रूप में प्रिंट करता है - जेएसओएन आउटपुट में एक संख्यात्मक प्रकार नहीं। – jro

+17

एक व्यापार परिप्रेक्ष्य से, यह एक भयानक दृष्टिकोण है। सीरियलाइजेशन समय पर पैसा गोल नहीं किया जाना चाहिए। यदि आप पिछला शून्य (पथ को अंधेरे से सेट करने से अलग) के साथ * पैड * करना चाहते हैं, तो आपको 'ROUND_HALF_UP' के बिना ऐसा करना होगा। इसके अलावा, विभिन्न मुद्राएं पिछली दशमलव की विभिन्न संख्याओं की अपेक्षा करती हैं। –

+1

jro, अगर स्टीव के serialize() में writeString() लिखने के बजाय WrumberNumber() का उपयोग किया जाता है, तो फ़ील्ड जेएसओएन में एक संख्या के रूप में दिखाएगा। – caelumvox

16
इसके बजाय प्रत्येक सदस्य पर @JsonSerialize स्थापित करने या मनुष्य आप एक मॉड्यूल है कि एक निश्चित प्रकार के लिए एक custome serializer का उपयोग कॉन्फ़िगर कर सकते हैं की

:

SimpleModule module = new SimpleModule(); 
module.addSerializer(BigInteger.class, new ToStringSerializer()); 
objectMapper.registerModule(module); 

उपरोक्त उदाहरण में, मैं स्ट्रिंग के लिए इस्तेमाल किया BigIntegers serialize करने के लिए serializer (चूंकि जावास्क्रिप्ट ऐसे संख्यात्मक मूल्यों को संभाल नहीं सकता है)।

+1

* जहां मैं ग्राहक धारावाहिक परिभाषित करता हूं? यह वही है जो मैं करना चाहता हूं, लेकिन मैं इस कोड को कहां रखना चाहता हूं। – DaveH

+0

जहां भी आप चाहें, आपको बस com.fasterxml.jackson.databind.JsonSerializer – Modi

+0

लागू करना होगा क्या आप थोड़ा और विशिष्ट हो सकते हैं? मुझे अभी भी यह नहीं मिला है कि इसे कहां रखा जाए। – Wouter

4

मैं jackson-datatype-money के रखरखाव में से एक हूं, इसलिए इस जवाब को नमक के अनाज के साथ लें क्योंकि मैं निश्चित रूप से पक्षपाती हूं। मॉड्यूल को आपकी जरूरतों को पूरा करना चाहिए और यह बहुत हल्का वजन (कोई अतिरिक्त रनटाइम निर्भरता नहीं है)। इसके अलावा इसमें Jackson docs, Spring docs में उल्लेख किया गया है और यहां तक ​​कि some discussions भी पहले से ही जैक्सन के आधिकारिक पारिस्थितिक तंत्र में इसे एकीकृत करने के तरीके के बारे में बताया गया था।

संबंधित मुद्दे