2014-11-06 7 views
7

Я хочу прочитать из json-файла с Matlab и хранить все в «данных» как объекты. После импорта мне нужно перебрать все и извлечь определенные значения, если они доступны в объекте.Прочитайте объекты JSON с Matlab

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

+0

Некоторые возможности для синтаксического анализа json: http : //undocumentedmatlab.com/blog/json-matlab-integration – Daniel

ответ

2

Вы можете попробовать разбор, используя другую библиотеку json, такую ​​как this one on file exchange.

В качестве альтернативы вы можете попробовать некоторые из методов, перечисленных в this site, например, используя интеграцию Java и .NET Matlab и загрузку одной из их json-библиотек.

В качестве третьей альтернативы, поскольку метод, который вы показали выше, с радостью загрузит первый объект в строке, вы всегда можете выполнить ручной предварительный анализ строки в массив ячеек строк, содержащих один объект, а затем разобрать их.

4

Если файл доступен черезhttp или https, вы можете использовать функцию webread из Data Import and Export инструментов. Он автоматически преобразует файлы 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 не сделала эту программу доступной вне инструментария.

Лучшие

6

Вы пытаетесь прочитать файл JSON, который не является действительным. Я рекомендую использовать jsonlint для быстрой проверки.

Ваш JSON выглядит

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

Это не действительный синтаксис, так как он описывает два объекта. После первого } парсер ожидает конца файла, потому что json-файл содержит один объект.

Возможные исправления являются:

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

или

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

Это решило мою проблему. Один из них должен заботиться об этом синтаксисе даже с помощью функции webread. – Tik0

0

Если вы просто хотите, чтобы прочитать весь JSON-файлы в MATLAB, и у C++ 11 компилятору, вы можете использовать очень быстро json_read mex функция.