Java序列化JSON時long型數值不許確

現象

項目中用到了惟一ID生成器.生成出的ID時long型的(好比說4616189619433466044).
經過某個rest接口中返回json數據後,發現瀏覽器解析完變成了4616189619433466000javascript

緣由

大體描述:java中得long能表示的範圍比js中number大,也就意味着部分數值在js中存不下(變成不許確的值).
詳情參考這裏http://stackoverflow.com/questions/17320706/javascript-long-integerjava

rest接口返回的json字符串中,數值仍是對的.當js對json進行解析並轉成js object的時候,出現了問題.json

解決方法

方法就是不用number來保存long值,而是使用string.能夠在客戶端js修改,也能夠在服務端序列化的時候修改.
此處給出sprign mvc 使用 jackson時的解決方案.瀏覽器

[@Override](https://my.oschina.net/u/1162528)
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
    MappingJackson2HttpMessageConverter jackson2HttpMessageConverter = new MappingJackson2HttpMessageConverter();

    ObjectMapper objectMapper = new ObjectMapper();
    /**
     * 序列換成json時,將全部的long變成string
     * 由於js中得數字類型不能包含全部的java long值
     */
    SimpleModule simpleModule = new SimpleModule();
    simpleModule.addSerializer(Long.class, ToStringSerializer.instance);
    simpleModule.addSerializer(Long.TYPE, ToStringSerializer.instance);
    objectMapper.registerModule(simpleModule);

    jackson2HttpMessageConverter.setObjectMapper(objectMapper);
    converters.add(jackson2HttpMessageConverter);
}
相關文章
相關標籤/搜索