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

读取Arduino生成的JSON文件时MATLAB报jsondecode语法错误

问题描述

我使用以下MATLAB脚本读取Arduino板生成的test1.json文件:

fileName = 'test1.json';            % JSON格式文件名
str = fileread(fileName);           % 将文件读取为文本
data = jsondecode(str);             % 解析JSON字符串

运行时触发错误:

Error using jsondecode
JSON syntax error at line 1, column 79 (character 79): additional text.
Error in read_json (line 4)
data = jsondecode(str); % Using the jsondecode function to parse JSON from a string

我推测问题出在引号、逗号或括号的格式上,需要提取文件中acc_x、acc_y、acc_z的加速度值用于后续MATLAB处理,当前JSON文件内容如下:

{"acc_x": 0.24, "acc_y": 0.78, "acc_z": 0.46, "Timestamp": 1691078254.4053023},
{"acc_x": 0.27, "acc_y": 0.78, "acc_z": 0.47, "Timestamp": 1691078254.4153075},
{"acc_x": 0.29, "acc_y": 0.78, "acc_z": 0.5, "Timestamp": 1691078254.43097},
{"gy_x": -35.89, "gy_y": 3.78, "gy_z": 14.4, "Timestamp": 1691078254.43097},
{"acc_x": 0.32, "acc_y": 0.78, "acc_z": 0.47, "Timestamp": 1691078254.4409742},
{"gy_x": -33.39, "gy_y": 2.62, "gy_z": 13.98, "Timestamp": 1691078254.4409742},
{"acc_x": 0.32, "acc_y": 0.78, "acc_z": 0.44, "Timestamp": 1691078254.4409742},
{"gy_x": -29.79, "gy_y": 1.83, "gy_z": 8.79, "Timestamp": 1691078254.4409742},
{"acc_x": 0.27, "acc_y": 0.8, "acc_z": 0.41, "Timestamp": 1691078254.456637},
{"gy_x": -25.57, "gy_y": -0.37, "gy_z": 7.51, "Timestamp": 1691078254.456637},
{"acc_x": 0.25, "acc_y": 0.82, "acc_z": 0.44, "Timestamp": 1691078254.4666882},
{"gy_x": -25.57, "gy_y": -1.65, "gy_z": 8.85, "Timestamp": 1691078254.4767776},
{"acc_x": 0.22, "acc_y": 0.82, "acc_z": 0.46, "Timestamp": 1691078254.4767776},
{"gy_x": -28.81, "gy_y": -0.31, "gy_z": 11.29, "Timestamp": 1691078254.4767776},
{"acc_x": 0.23, "acc_y": 0.82, "acc_z": 0.46, "Timestamp": 1691078254.486785},
错误原因

你提供的JSON文件不符合标准格式:它是多个独立JSON对象用逗号分隔,但没有包裹在数组的[]中,且最后一行末尾存在多余逗号,导致jsondecode无法正确解析。

解决方案

方案一:修正JSON文件格式

手动或修改Arduino代码,将所有对象包裹在数组中,并删除最后一行的逗号,修正后的JSON如下:

[
{"acc_x": 0.24, "acc_y": 0.78, "acc_z": 0.46, "Timestamp": 1691078254.4053023},
{"acc_x": 0.27, "acc_y": 0.78, "acc_z": 0.47, "Timestamp": 1691078254.4153075},
{"acc_x": 0.29, "acc_y": 0.78, "acc_z": 0.5, "Timestamp": 1691078254.43097},
{"gy_x": -35.89, "gy_y": 3.78, "gy_z": 14.4, "Timestamp": 1691078254.43097},
{"acc_x": 0.32, "acc_y": 0.78, "acc_z": 0.47, "Timestamp": 1691078254.4409742},
{"gy_x": -33.39, "gy_y": 2.62, "gy_z": 13.98, "Timestamp": 1691078254.4409742},
{"acc_x": 0.32, "acc_y": 0.78, "acc_z": 0.44, "Timestamp": 1691078254.4409742},
{"gy_x": -29.79, "gy_y": 1.83, "gy_z": 8.79, "Timestamp": 1691078254.4409742},
{"acc_x": 0.27, "acc_y": 0.8, "acc_z": 0.41, "Timestamp": 1691078254.456637},
{"gy_x": -25.57, "gy_y": -0.37, "gy_z": 7.51, "Timestamp": 1691078254.456637},
{"acc_x": 0.25, "acc_y": 0.82, "acc_z": 0.44, "Timestamp": 1691078254.4666882},
{"gy_x": -25.57, "gy_y": -1.65, "gy_z": 8.85, "Timestamp": 1691078254.4767776},
{"acc_x": 0.22, "acc_y": 0.82, "acc_z": 0.46, "Timestamp": 1691078254.4767776},
{"gy_x": -28.81, "gy_y": -0.31, "gy_z": 11.29, "Timestamp": 1691078254.4767776},
{"acc_x": 0.23, "acc_y": 0.82, "acc_z": 0.46, "Timestamp": 1691078254.486785}
]

修改后原MATLAB脚本可正常运行,用以下代码提取加速度值:

% 提取所有acc字段
acc_x = [data.acc_x];
acc_y = [data.acc_y];
acc_z = [data.acc_z];
% 过滤陀螺仪条目产生的NaN值
acc_x = acc_x(~isnan(acc_x));
acc_y = acc_y(~isnan(acc_y));
acc_z = acc_z(~isnan(acc_z));

方案二:MATLAB中直接处理原始文本

若不想修改JSON文件,可在MATLAB中读取文本后手动修正格式:

fileName = 'test1.json';
str = fileread(fileName);
% 去除末尾多余逗号
str = strtrim(str);
if endsWith(str, ',')
    str = str(1:end-1);
end
% 包裹为标准JSON数组格式
str = ['[', str, ']'];
% 解析并提取加速度值
data = jsondecode(str);
acc_x = [data.acc_x];
acc_y = [data.acc_y];
acc_z = [data.acc_z];
acc_x = acc_x(~isnan(acc_x));
acc_y = acc_y(~isnan(acc_y));
acc_z = acc_z(~isnan(acc_z));

内容的提问来源于stack exchange,提问作者Tomás Herrera

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 00:45:54