最近前端在解析后端返回的 json 数据时解析后发现数值类型的精度丢失,长度超过17位后面的所有数都变成 0 ;
var obj = 'var obj = '{"id":50000000000050153333}';
var jsonObj = JSON.parse(obj);
console.log(jsonObj);';
打印的结果为(16位之后都边成0):
50000000000050150000
解决办法:
由于数据是通过第三方接口返回的 xml 字符串转换而来,所以决定在后端将所有字段转成字符串返回!!!
导入hutool.json的maven包
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-json</artifactId>
<version>5.0.6</version>
</dependency>
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import cn.hutool.json.XML;
public class XMLUtil {
public static void main(String[] args) {
//模仿第三方接口返回的数据
String xml = "<persons>\n" +
" <person>\n" +
" <userName>测试</userName>\n" +
" <userEmail>测试</userEmail>\n" +
" <describe>测试</describe>\n" +
" <passWord>测试</passWord>\n" +
" <phone>12345678990</phone>\n" +
" <idCard>12345678910111213</idCard>\n" +
" </person>\n" +
" <person>\n" +
" <userName>测试</userName>\n" +
" <userEmail>测试</userEmail>\n" +
" <describe>测试</describe>\n" +
" <passWord>测试</passWord>\n" +
" <phone>12345678990</phone>\n" +
" <idCard>12345678910111213</idCard>\n" +
" </person>\n" +
"</persons>";
//xml数据转为JSONObject
JSONObject jsonObject = XML.toJSONObject(xml);
//JSONObject的所有value值转为字符换
jsonObjectChangeString(jsonObject);
//JSONObject转为json字符串
String jsonStr = JSONUtil.toJsonStr(jsonObject);
System.out.println(jsonStr);
}
/**
* JSONObject的所有value值转为字符换
*
* @param object object
*/
public static void jsonObjectChangeString(Object object) {
if (object instanceof JSONObject) {
JSONObject jsonObject = (JSONObject) object;
for (Map.Entry<String, Object> stringObjectEntry : jsonObject.entrySet()) {
Object o = stringObjectEntry.getValue();
if (o instanceof Long || o instanceof Integer || o instanceof Double) {
stringObjectEntry.setValue(o.toString());
} else if (o instanceof JSONArray) {
jsonObjectChangeString(o);
} else if (o instanceof JSONObject) {
jsonObjectChangeString(o);
}
}
}
if (object instanceof JSONArray) {
JSONArray jsonArray = (JSONArray) object;
for (Object o : jsonArray) {
jsonObjectChangeString(o);
}
}
}
}
运行结果:
{
"persons":{
"person":[
{
"passWord":"测试",
"phone":"12345678990",
"idCard":"12345678910111213",
"userEmail":"测试",
"describe":"测试",
"userName":"测试"
},
{
"passWord":"测试",
"phone":"12345678990",
"idCard":"12345678910111213",
"userEmail":"测试",
"describe":"测试",
"userName":"测试"
}
]
}
}