You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Matlab中使用jsondecode读取文件遇数值偏差与结构解析问题

解决Matlab中jsondecode的两个常见问题

问题1:大整数精度丢失,转为符号值

Matlab默认用double类型存储数值,但double的有效位数仅15-17位,超出范围的大整数会出现精度偏差。解决步骤:

  • 读取JSON文件内容为字符串:jsonStr = fileread('your_file.json');
  • 调用jsondecode时指定'BigNumber'参数为'string',让大整数以字符串形式完整保留:data = jsondecode(jsonStr, 'BigNumber', 'string');
  • 用递归函数遍历解析后的结构,将大整数字符串转为符号类型:
    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);
    
    这个函数会自动遍历cell数组和结构体,把所有可转数值的字符串转成符号类型,既保留精度又不破坏原有结构。

问题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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 00:47:10