JS解析JSON字符串,解析后数值的精度丢失问题

最近前端在解析后端返回的 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":"测试"
            }
        ]
    }
}

转载于:https://www.ycblog.top/article?articleId=157&pageNum=1

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值