为何JSON返回极小科学计数数值且解析后数组为空?
关于你遇到的两个JSON解析问题
一、为什么JSON会返回极小的科学计数法数值?
那些像2.2348142859517371e-314、6.9531204333502763e-310的数值,本质是未初始化/未赋值的数值类型变量被序列化后的“脏数据”,常见原因有这几种:
- 后端数据处理漏洞:如果后端代码里某个浮点型字段(比如double/float)没有被正确初始化或赋值,内存里残留的随机极小值就会被直接序列化成JSON返回。比如在C++/Java这类语言里,未赋值的局部变量会包含内存里的垃圾值,当这些变量被塞进JSON结构时,就会出现这类奇怪的数值。
- 浮点数精度下溢:极少数情况下,后端在计算数值时出现了浮点数下溢(比如除以一个极大的数,或者多次迭代计算后数值趋近于零但没被正确截断),最终生成了这种接近零的极小值,被JSON序列化成科学计数法。
- 排除前端解析问题:如果是前端解析导致的,一般不会出现这么统一的极小值,所以优先排查后端的字段初始化逻辑。
解决方向:
- 检查后端对应字段的赋值逻辑,确保所有数值类型字段在序列化前都被正确初始化(比如默认设为0,或者根据业务逻辑赋值)。
- 如果是计算导致的下溢,在计算后添加数值截断逻辑,把极小值直接转为0。
二、为什么函数能打印出值,但最终返回空数组?
这个问题几乎90%都是异步操作的时序问题,剩下的是作用域或变量赋值错误,具体分析:
最常见的情况:异步请求未等待完成就返回
比如你写的函数里发起了网络请求,但没有等待请求完成就直接return了空数组。举个JavaScript例子:
function fetchAndParse() { let result = []; fetch('/api/data') .then(res => res.json()) .then(data => { console.log(1, data.coords); // 这里能打印,因为是请求完成后的回调 result = data.coords; }); return result; // 这里直接返回空数组,因为fetch还没完成! }
这种情况下,函数返回的是初始的空数组,而打印是在异步回调里执行的,所以你能看到值,但返回结果不对。
解决方法:
- 把函数改成异步函数,用
async/await等待请求完成:
async function fetchAndParse() { const res = await fetch('/api/data'); const data = await res.json(); console.log(1, data.coords); return data.coords; // 现在返回的是正确的解析后数据 }
其他可能的原因:
- 变量作用域错误:比如在回调里重新声明了变量(用了
let/const),导致外部的数组没被赋值。比如:
function fetchAndParse() { let result = []; fetch('/api/data') .then(res => res.json()) .then(data => { let result = data.coords; // 这里重新声明了result,外部的result还是空的! console.log(1, result); }); return result; }
解决:去掉回调里的let,直接赋值给外部的result。
- 解析后的数据未正确赋值:比如你打印的是
data里的某个字段,但返回的是另一个没被赋值的数组变量,检查变量名是否一致。
内容的提问来源于stack exchange,提问作者Sara
相关产品推荐
相关产品推荐

