2014-11-06 31 views
7

Ich möchte aus einer JSON-Datei mit Matlab lesen und alles in "Daten" als Objekte speichern. Nach dem Import muss ich alle durchlaufen und bestimmte Werte extrahieren, wenn sie im Objekt verfügbar sind.JSON-Objekte mit Matlab lesen

JSON (Quelle):

{ 
    "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/Frage:

Wie Sie sehen, Matlab nur liest den Inhalt des ersten Klammern/Feld. Wie kann ich ALLE Klammern/Felder importieren, auch wenn ich nicht weiß wie viele es gibt?

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' 

Vielen Dank!

+2

Werfen Sie einen Blick hier: http://iso2mesh.sourceforge.net/cgi-bin/index.cgi?jsonlab Quelle hier: https://github.com/fangq/jsonlab – 0xMB

+0

Einige Möglichkeiten, JSON zu analysieren: http : //undocumentedmatlab.com/blog/json-matlab-integration – Daniel

Antwort

2

Sie könnten versuchen, mit einer anderen JSON-Bibliothek zu analysieren, z. B. this one on file exchange.

Alternativ können Sie einige der unter this site aufgelisteten Methoden ausprobieren, z. B. die Java und .NET Integration von Matlab verwenden und mit einer ihrer json Bibliotheken laden.

Als dritte Alternative, da die Methode, die Sie oben gezeigt haben, gerne das erste Objekt in der Zeichenfolge lädt, können Sie die Zeichenfolge manuell in ein Zellenarray mit Strings, die jeweils ein einzelnes Objekt enthalten, und dann diese analysieren.

4

Wenn Ihre Datei überhttp oder https zugänglich ist, können Sie die webread Funktion aus der Data Import and Export Toolbox verwenden. Es konvertiert automatisch JSON-Dateien in Matlab-Strukturen.

Es gibt eine decodeJSON Funktion in der Toolbox (MATLABROOT/toolbox/matlab/external/interfaces/webservices/restful/private/decodeJSON.m), aber die Hilfe eindeutig fest, dass:

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

Dennoch Sie Inspiration in dem Inhalt erhalten können Ihre eigene Lösung zu erstellen. Es ist schade, dass die Mathworks dieses Programm nicht außerhalb der Toolbox verfügbar gemacht haben.

Beste

6

Sie versuchen, eine JSON-Datei zu lesen, die nicht gültig ist. Ich empfehle, für eine schnelle Überprüfung zu verwenden.

Ihre json sieht aus wie

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

Das ist nicht eine gültige Syntax ist, weil es zwei Objekte beschreibt. Nach dem ersten } erwartet der Parser das Ende der Datei, weil eine JSON-Datei ein Objekt enthält.

Mögliche Korrekturen sind:

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

oder

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

Das löste mein Problem. Auch bei der Webread-Funktion muss man sich um diese Syntax kümmern. – Tik0

0

Wenn Sie nur ganze JSON-Dateien in MATLAB lesen möchten, und haben einen C++ 11-Compiler, können Sie die sehr schnell nutzen können json_read Mex-Funktion.