2014-09-20 51 views
1

我正在編寫一個自定義序列化器,以將double值轉換爲JSON對象中的字符串。到目前爲止我的代碼:基本類型的Jackson序列化器

public String toJson(Object obj) throws IOException { 
    ObjectMapper mapper = new ObjectMapper(); 
    SimpleModule module = new SimpleModule("DoubleSerializer", new Version(1, 0, 0, "")); 

    module.addSerializer(Double.class, new DoubleSerializer()); 
    mapper.registerModule(module); 
    return mapper.writeValueAsString(obj); 
} 

public class DoubleSerializer extends JsonSerializer<Double> { 
    @Override 
    public void serialize(Double value, JsonGenerator jgen, 
      SerializerProvider provider) throws IOException, 
      JsonProcessingException { 
     String realString = new BigDecimal(value).toPlainString(); 
     jgen.writeString(realString); 
    } 
} 

這工作完全正常雙(類成員),但雙(基本型)的成員不起作用。例如,

public void test() throws IOException { 
     JsonMaker pr = new JsonMaker(); 
     TestClass cl = new TestClass(); 

     System.out.println(pr.toJson(cl)); 

    } 

    class TestClass { 
     public Double x; 
     public double y; 
     public TestClass() { 
      x = y = 1111142143543543534645145325d; 
     } 
    } 

返回:{ 「X」: 「1111142143543543565865975808」, 「Y」:1.1111421435435436E27}

有沒有一種方法,使其遵循相同的行爲,對於兩種情況?

回答

10

您可以爲原始類型double註冊JsonSerializer

module.addSerializer(double.class, new DoubleSerializer()); 
+0

哇!不能相信我在這上面失去了一個小時:)謝謝! – mihsathe 2014-09-20 04:06:24

-1

你可以用自定義序列化程序來做,但有一個更簡單的方法。 啓用JsonGenerator.Feature.WRITE_NUMBERS_AS_STRINGS

mapper.getFactory().enable(JsonGenerator.Feature.WRITE_NUMBERS_AS_STRINGS); 
+0

我認爲這是在v2.3中添加的。我只限於2.2。 – mihsathe 2014-09-24 22:28:15

+0

我剛剛測試過它:你仍然得到科學記數法 – Chris 2016-11-30 17:27:52

+0

其實這可能是真的......因爲它只是引用數字。不幸的是,雖然有'JsonGenerator.Feature.WRITE_BIGDECIMAL_AS_PLAIN',隻影響'BigDecimals'而不是'double's或'float's。可能有意義提出一個問題,爲非BigDecimal浮點值添加單獨的JsonGenerator.Feature。 – StaxMan 2016-11-30 23:43:49

相關問題