【问题标题】:Read JSON objects with Matlab使用 Matlab 读取 JSON 对象
【发布时间】:2014-11-06 18:54:29
【问题描述】:

我想用 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'

谢谢!

【问题讨论】:

标签: json matlab object


【解决方案1】:

您正在尝试读取无效的 json 文件。我建议使用jsonlint 进行快速验证。

你的 json 看起来像

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

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

可能的修复方法是:

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

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

【讨论】:

  • 这解决了我的问题。即使使用 webread 函数,也必须关心这种语法。
【解决方案2】:

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

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

% 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 没有在工具箱之外提供这个程序。

最好的

【讨论】:

    【解决方案3】:

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

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

    作为第三种选择,由于您上面显示的方法将愉快地加载字符串中的第一个对象,您总是可以手动将字符串预解析为每个包含单个对象的字符串元胞数组,并且然后解析那些。

    【讨论】:

      【解决方案4】:

      如果您只想将整个 JSON 文件读入 MATLAB,并拥有 C++11 编译器,则可以使用非常快的 json_read mex 函数。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-01-20
        • 1970-01-01
        • 1970-01-01
        • 2018-08-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多