2011-09-04 18 views
5

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

निम्नलिखित मेरे सबसे अच्छे शॉट है, लेकिन इस में विफल रहता है के रूप में serializer वस्तु नक्शाकार द्वारा उठाया नहीं है सरणी एन्कोड करने के लिए:

class MyTest 
{ 
    public class MyDoubleSerializer extends JsonSerializer<double[]> 
    { 
    public void serialize(double[] value, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonProcessingException 
    { 
     for (double d : value) 
     { 
     jgen.writeStartArray(); 
     jgen.writeRaw(df.format(d)); 
     jgen.writeEndArray(); 
     } 
    } 
    } 

    @Test 
    public void test1() throws Exception 
    { 
    ObjectMapper mapper = new ObjectMapper(); 
    SimpleModule module = new SimpleModule("MyModule", new Version(0, 1, 0, "alpha")); 
    module.addSerializer(double[].class, new MyDoubleSerializer()); 
    mapper.registerModule(module); 

    Map<String, Object> data = new HashMap<String, Object>(); 
    double[] doubleList = { 1.1111111111D, (double) (System.currentTimeMillis()) }; 
    data.put("test", doubleList); 
    System.out.print(mapper.writeValueAsString(data)); 
    } 
} 

उत्पादन होता है:

{ "परीक्षण" [1.1111111111,1.315143204964E12}

क्या मैं के लिए देख रहा था:

{ "परीक्षण" [1.32E12, 1.11E0]}

कोई भी विचार?

इसके अलावा, मुझे स्ट्रिंग उत्पन्न करना पसंद नहीं है और लिखना कच्चा है - क्या मैं ऐसा करने के लिए स्ट्रिंगबफर को दशमलव फोर्मेट में खिला सकता हूं?

धन्यवाद

उत्तर

4

, इस को हल करने प्रबंधित से उधार में निर्मित डबल के लिए serializer।

यह एक हैक का थोड़ा सा है, क्योंकि writeRaw() संदर्भ के बारे में परवाह नहीं करता है और सरणी सदस्यों के बीच एक अल्पविराम नहीं लिखता है, इसलिए मैं जेसन लेखक कास्टिंग कर रहा हूं और इसे लिखने के लिए वेल्यू() विधि को कॉल कर रहा हूं इस।

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

का आनंद लें ...

public class JacksonDoubleArrayTest 
{ 
    private DecimalFormat df = new DecimalFormat("0.##E0"); 

    public class MyDoubleSerializer extends org.codehaus.jackson.map.ser.ScalarSerializerBase<Double> 
    { 
     protected MyDoubleSerializer() 
     { 
      super(Double.class); 
     } 

     @Override 
     public final void serializeWithType(Double value, JsonGenerator jgen, SerializerProvider provider, TypeSerializer typeSer) throws IOException, 
       JsonGenerationException 
     { 
      serialize(value, jgen, provider); 
     } 

     @Override 
     public void serialize(Double value, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonGenerationException 
     { 
      if (Double.isNaN(value) || Double.isInfinite(value)) 
      { 
       jgen.writeNumber(0); // For lack of a better alternative in JSON 
       return; 
      } 

      String x = df.format(value); 
      if (x.endsWith("E0")) 
      { 
       x = x.substring(0, x.length() - 2); 
      } 
      else if (x.endsWith("E1") && x.length() == 6) 
      { 
       x = "" + x.charAt(0) + x.charAt(2) + '.' + x.charAt(3); 
      } 
      JsonWriteContext ctx = (JsonWriteContext)jgen.getOutputContext(); 
      ctx.writeValue(); 
      if (jgen.getOutputContext().getCurrentIndex() > 0) 
      { 
       x = "," + x; 
      } 
      jgen.writeRaw(x); 
     } 

     @Override 
     public JsonNode getSchema(SerializerProvider provider, Type typeHint) 
     { 
      return createSchemaNode("number", true); 
     } 
    } 

    @SuppressWarnings("unchecked") 
    private static Map<String, Object> load() throws JsonParseException, JsonMappingException, IOException 
    { 
     ObjectMapper loader = new ObjectMapper(); 
     return (Map<String, Object>)loader.readValue(new File("x.json"), Map.class); 
    } 

    @Test 
    public void test1() throws JsonGenerationException, JsonMappingException, IOException 
    { 
     ObjectMapper mapper = new ObjectMapper(); 
     SimpleModule module = new SimpleModule("StatsModule", new Version(0, 1, 0, "alpha")); 
     module.addSerializer(Double.class, new MyDoubleSerializer()); 
     mapper.registerModule(module); 
     String out = mapper.writeValueAsString(load()); 
     // System.out.println(out.length()); 
    } 
}