Matlab中使用jsondecode读取文件遇数值偏差与结构解析问题
解决Matlab中jsondecode的两个常见问题
问题1:大整数精度丢失,转为符号值
Matlab默认用double类型存储数值,但double的有效位数仅15-17位,超出范围的大整数会出现精度偏差。解决步骤:
- 读取JSON文件内容为字符串:
jsonStr = fileread('your_file.json'); - 调用
jsondecode时指定'BigNumber'参数为'string',让大整数以字符串形式完整保留:data = jsondecode(jsonStr, 'BigNumber', 'string'); - 用递归函数遍历解析后的结构,将大整数字符串转为符号类型:
这个函数会自动遍历cell数组和结构体,把所有可转数值的字符串转成符号类型,既保留精度又不破坏原有结构。function data = str2symRecursive(data) if iscell(data) for i = 1:length(data) data{i} = str2symRecursive(data{i}); end elseif isstruct(data) fields = fieldnames(data); for f = 1:length(fields) data.(fields{f}) = str2symRecursive(data.(fields{f})); end elseif isstring(data) && ~isnan(str2double(data)) data = sym(data); end end data = str2symRecursive(data);
问题2:括号被忽略导致结构解析错误
你遇到的结构合并问题,大概率是大整数精度丢失引发的连锁反应——大整数被错误转成double后,可能干扰JSON数组的边界识别。解决思路是先将大整数转为字符串再解析:
- 用正则表达式把JSON中超出double精确范围的大整数(绝对值大于2^53)用双引号括起来,转为字符串类型:
pattern = '(-?\d{16,})'; jsonStr = regexprep(jsonStr, pattern, '"$1"'); - 再用
jsondecode(jsonStr)解析,此时结构会正确保留,之后按问题1的方法将字符串转成符号值即可。 - 如果是jsondecode本身的解析bug(极少数情况),可尝试手动拆分JSON字符串,或切换到Matlab旧版本的
jsonread函数,但优先推荐先处理大整数的字符串化,这是最根本的解决方式。
内容的提问来源于stack exchange,提问作者Jeferson L. Zapata
相关产品推荐
相关产品推荐

