读取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
相关产品推荐
相关产品推荐

