2012-06-20 22 views
12

में वैज्ञानिक संकेतन बंदजब मैं Gson का उपयोग एक वस्तु है कि शून्य को यह वैज्ञानिक ई अंकन का उपयोग कर रहा है करीब एक डबल मान क्रमानुसार करने Gson डबल क्रमबद्धता

{"doublevaule":0.00056} 

इसके बजाय? मैं एक कस्टम जेसनसेरियलाइज़र को कार्यान्वित कर सकता हूं, लेकिन यह एक जेसन एलिमेंट देता है। मुझे एक जेसनप्रिमेटिव वापस करना होगा जिसमें दोहराया गया है जिसके बारे में कोई नियंत्रण नहीं है कि यह क्रमबद्ध कैसे है।

धन्यवाद!

+4

एक समस्या यह है कि क्यों है? वैज्ञानिक नोटेशन जेएसओएन में मान्य है और जेएसओएन को संभालने वाली किसी भी चीज को सही तरीके से पार्स करने में सक्षम होना चाहिए (बिल्कुल उसी मूल्य के लिए जैसे वैज्ञानिक नोटेशन का उपयोग नहीं किया गया था)। –

+0

मैं इसके साथ बहस नहीं करता, आप सही Joachim हैं। फिर भी मैं अपने JSON को वैज्ञानिक नोटेशन नहीं रखना चाहता हूं। क्या यह जीएसओएन के साथ काम करने योग्य है? – konstantin

+0

मेरे पास बिल्कुल वही समस्या है, बस इस तथ्य के कारण मेरे पास एक JSON उपभोक्ता टूटा हुआ है जो एक्सपोनेंट को संभाल नहीं सकता है। मुझे एहसास है कि वास्तविक * फिक्स उपभोक्ता को सॉर्ट करना है, लेकिन कभी-कभी यह हमारे नियंत्रण से बाहर है। इसलिए मुझे लगता है कि यह एक उचित (यदि असामान्य) आवश्यकता है –

उत्तर

2

आप JsonWriter और विस्तार की कोशिश कर सकते अधिभावी the method value(double)

यह (यदि आप मौजूदा कोड नकल करने काफी आवश्यकता होगी) इस तरह से संशोधित किया जा करने के लिए बनाया जा करने के लिए प्रतीत नहीं होता है, लेकिन इसे पाने के लिए संभव हो जाना चाहिए यह काम कर रहा है

दुर्भाग्य से मुझे आउटपुट प्रारूप को प्रभावित करने का कोई अन्य कारण नहीं दिखता है।

+0

यह सही दृष्टिकोण है, लेकिन इसके लिए शायद बहुत सारे डुप्लिकेट कोड की आवश्यकता होगी। JsonWriter इस तरह की विस्तारशीलता के लिए डिज़ाइन नहीं किया गया था और आवश्यक हुक की कमी है। –

9

Double के लिए एक नया धारावाहिक प्रदान क्यों नहीं करें? (आपको double के बजाय Double का उपयोग करने के लिए अपनी ऑब्जेक्ट को फिर से लिखना होगा)।

फिर serialiser में आप एक BigDecimal में बदल सकते हैं, और पैमाने के साथ आदि

उदा खेलने

GsonBuilder gsonBuilder = new GsonBuilder(); 
    gsonBuilder.registerTypeAdapter(Double.class, new JsonSerializer<Double>() { 
     @Override 
     public JsonElement serialize(final Double src, final Type typeOfSrc, final JsonSerializationContext context) { 
      BigDecimal value = BigDecimal.valueOf(src); 

      return new JsonPrimitive(value); 
     } 
    }); 

    gson = gsonBuilder.create(); 

ऊपर प्रस्तुत करना होगा (जैसे) के रूप में 9.166666E-60.000009166666

1

से पहले के लिए Double

GsonBuilder gsonBuilder = new GsonBuilder(); 
gsonBuilder.registerTypeAdapter(Double.class, new JsonSerializer<Double>() { 
    @Override 
    public JsonElement serialize(Double originalValue, Type typeOf, JsonSerializationContext context) { 
     BigDecimal bigValue = BigDecimal.valueOf(originalValue); 

     return new JsonPrimitive(bigValue.toPlainString()); 
    } 
}); 

एक कस्टम serializer बनाएं: { "राशि": 1.0E9}

के बाद: {"राशि": "1000000000"}

बिल्कुल सही नहीं है क्योंकि यह JSON में एक स्ट्रिंग है।

2

आंतरिक GSON संख्या # toString का उपयोग करता है तो हम सिर्फ एक संख्या का एक नया उदाहरण बनाने की जरूरत:

.registerTypeAdapter(Double.class, new JsonSerializer<Double>() { 
    @Override 
    public JsonElement serialize(final Double src, final Type typeOfSrc, final JsonSerializationContext context) { 

     Number n = new Number() { 

      @Override 
      public long longValue() { 
       return 0; 
      } 

      @Override 
      public int intValue() { 
       return 0; 
      } 

      @Override 
      public float floatValue() { 
       return 0; 
      } 

      @Override 
      public double doubleValue() { 
       return 0; 
      } 

      @Override 
      public String toString() { 
       return new BigDecimal(src).toPlainString(); 
      } 

     }; 

     return new JsonPrimitive(n); 
    } 
}) 
2

Brian Agnew's answer पर एक मामूली परिवर्तन:

public class DoubleJsonSerializer implements JsonSerializer<Double> { 
    @Override 
    public JsonElement serialize(final Double src, final Type typeOfSrc, final JsonSerializationContext context) { 
     BigDecimal value = BigDecimal.valueOf(src); 
     try { 
      value = new BigDecimal(value.toBigIntegerExact()); 
     } catch (ArithmeticException e) { 
      // ignore 
     } 

     return new JsonPrimitive(value); 
    } 
}