2014-11-06 323 views
7

我想从Matlab的json文件中读取数据,并将所有内容作为对象存储在“数据”中。导入之后,如果对象中可用,我需要遍历所有值并提取特定值。用Matlab读取JSON对象

JSON(来源):

{ 
    "eid": 44000, 
    "dpm_id": { 
     "dpm": "fm", 
     "pwr": "main" 
    }, 
    "fpga_id": 3189637128, 
    "fpga_ver": 3104379702, 
    "boot_id": 0, 
    "pbs_ver": "PBS 2012-05-07 16:41" 
} 
{ 
    "sid": 1, 
    "hk1": { 
     "bela_mode": "pbs_mode", 
     "pbs_version": "version 1.3", 
     "scet": "2038-01-19T03:14:08", 
     "ref_time": "0:00:00", 
     "tc_received": 2, 
     "tc_exec": 2, 
     "tc_err_ack": 0, 
     "tc_err_exec": 1, 
     "tm_total": 1, 
     "tm_sent": 1, 
     "tm_dropped": 0, 
     .... 

Matlab的(进口,according to this website, resp. Class):

fname = 'FileName.json'; 
fid = fopen(fname); 
raw = fread(fid,inf); 
str = char(raw'); 
fclose(fid); 

data = JSON.parse(str) 

问题/疑问:

正如你看到的,只有Matlab的读取第一个的内容括号/场。如何导入所有括号/字段,即使我不知道有多少个字段?

data = 

     eid: 44000 
     dpm_id: [1x1 struct] 
    fpga_id: 3.1896e+09 
    fpga_ver: 3.1044e+09 
    boot_id: 0 
    pbs_ver: 'PBS 2012-05-07 16:41' 

谢谢!

+2

看看这里:http://iso2mesh.sourceforge.net/cgi-bin/index.cgi?jsonlab 来源:https://github.com/fangq/jsonlab – 0xMB 2014-11-06 19:00:41

+0

解析json的一些可能性:http ://undocumentedmatlab.com/blog/json-matlab-integration – Daniel 2015-07-07 14:13:13

回答

2

你可以尝试使用另一个json库进行解析,比如this one on file exchange

或者,您可以尝试一些this site上列出的方法,例如使用matlab的Java和.NET集成和加载其一个json库。

作为第三种替代方法,由于上面显示的方法将愉快地加载字符串中的第一个对象,因此可以随时对字符串进行一些手动预解析,将其分别包含单个对象的单元数组,然后解析这些。

4

如果你的文件通过httphttps是访问,您可以从Data Import and Export工具箱使用webread功能。它会自动将JSON文件转换为Matlab结构。

有工具箱(MATLABROOT/toolbox/matlab/external/interfaces/webservices/restful/private/decodeJSON.m)一decodeJSON功能,但帮助中明确指出:

% FOR INTERNAL USE ONLY -- This function is intentionally undocumented 
% and is intended for use only within the scope of functions and classes 
% in toolbox/matlab/external/interfaces/webservices/restful. Its behavior 
% may change, or the class itself may be removed in a future release. 

不过你可以在内容中获取灵感,以建立自己的解决方案。很遗憾Mathworks没有在工具箱之外提供这个程序。

最好

6

你正试图读取一个json文件,这是无效的。我建议使用jsonlint进行快速验证。

您的JSON看起来像

{ 
    "skipped":"A"  
} 
{ 
    "skipped":"B" 
} 

这不是一个有效的语法,因为它描述了两个对象。在第一个}之后,解析器期望文件结束,因为json文件包含一个对象。

可能的修补程序是:

[ 
    { 
     "skipped": "A" 
    }, 
    { 
     "skipped": "B" 
    } 
] 

{ 
    "aa": { 
     "skipped": "A" 
    }, 
    "bb": { 
     "skipped": "B" 
    } 
} 
+0

这解决了我的问题。即使使用webread函数,也必须关心这个语法。 – Tik0 2015-09-07 09:46:14

0

如果你只是想读取整个JSON文件到MATLAB,并有一个C++编译器11,可以使用非常快json_read mex函数。