如何避免net.sf.json-lib转换XML时出现科学计数法
解决json-lib XML转JSON时长整数变为科学计数法的问题
首先,你遇到的这个问题根源在于:json-lib默认会把较大的整数解析为Double类型,而Double在表示超出常规长度的整数时,会自动切换为科学计数法格式。不过我们可以通过配置JsonConfig来强制它以Long类型处理整数,从而避免这个问题;如果觉得配置繁琐,更换更现代的库会是更省心的选择。
方法一:配置json-lib强制保留整数格式
你可以在调用xmlSerializer.read()时传入自定义的JsonConfig,指定数字类型为Long,同时添加处理器将误解析为Double的整数转换回Long:
XMLSerializer xmlSerializer = new XMLSerializer(); xmlSerializer.clearNamespaces(); xmlSerializer.setSkipNamespaces(true); xmlSerializer.setForceTopLevelObject(false); // 自定义JsonConfig,处理数字类型 JsonConfig jsonConfig = new JsonConfig(); // 设置默认Double处理器,将整数型Double转为Long jsonConfig.setDefaultDoubleProcessor((value, config) -> { Double doubleVal = (Double) value; if (doubleVal.longValue() == doubleVal) { return doubleVal.longValue(); } return value; }); net.sf.json.JSON json = xmlSerializer.read(xmlString, jsonConfig);
这段代码会把原本被解析成Double的整数转换为Long类型,输出JSON时就会以完整的整数形式展示,而非科学计数法。
方法二:更换更现代的JSON/XML转换库
json-lib已经多年没有更新,存在不少兼容性和性能问题。如果后续还有更多复杂的序列化需求,非常推荐更换为Jackson或Gson这类维护活跃的现代库,它们默认就能正确处理大整数格式。
用Jackson实现转换的示例
Jackson的XmlMapper可以轻松解决这个问题,代码简洁且行为符合预期:
import com.fasterxml.jackson.dataformat.xml.XmlMapper; import com.fasterxml.jackson.databind.ObjectMapper; public class XmlToJsonConverter { public static void main(String[] args) throws Exception { String xmlString = "<?xml version=\"1.0\" encoding=\"ISO-8859-15\"?>\n" + "<rootTag>\n" + "<_id type=\"number\">7000000001</_id>\n" + "</rootTag>"; XmlMapper xmlMapper = new XmlMapper(); Object xmlObj = xmlMapper.readValue(xmlString, Object.class); ObjectMapper jsonMapper = new ObjectMapper(); String jsonString = jsonMapper.writeValueAsString(xmlObj); System.out.println(jsonString); // 输出结果:{"_id":7000000001} } }
Jackson不仅能正确处理大整数,还支持丰富的自定义配置,社区活跃、文档完善,是当前Java生态中JSON/XML处理的主流选择。
内容的提问来源于stack exchange,提问作者Limmy
相关产品推荐
相关产品推荐

