Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Read JSON objects with Matlab

I want to read from a json file with Matlab and store everything in "data" as objects. After import, I need to iterate through all and extract specific values, if it's available in the object.

JSON (source):

{
    "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 (import, 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)

Problem/Question:

As you see, Matlab only reads the content of the first brackets/field. How can I import ALL brackets/fields, even if I don't know how many there are?

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'

Thank you!

like image 702
Kevin Avatar asked Nov 06 '14 18:11

Kevin


2 Answers

You are trying to read a json file, which is not valid. I recommend to use jsonlint for a quick verification.

Your json looks like

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

That is not a valid syntax, because it describes two objects. After the first } the parser expects the end of file because a json file contains one object.

Possible fixes are:

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

or

{
    "aa": {
        "skipped": "A"
    },
    "bb": {
        "skipped": "B"
    }
}
like image 84
Daniel Avatar answered Oct 02 '22 00:10

Daniel


If your file is accessible via http or https, you can use the webread function from the Data Import and Export toolbox. It automatically converts JSON files to Matlab structures.

There is a decodeJSON function in the toolbox (MATLABROOT/toolbox/matlab/external/interfaces/webservices/restful/private/decodeJSON.m), but the help clearly states that:

% 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.

Nevertheless you can get inspiration in the content to build your own solution. It's a pity that the Mathworks didn't made this program available outside the toolbox.

Best

like image 23
Ratbert Avatar answered Oct 02 '22 00:10

Ratbert