2014-11-06 17 views
7

Tôi muốn đọc từ tệp json với Matlab và lưu trữ mọi thứ trong "dữ liệu" làm đối tượng. Sau khi nhập khẩu, tôi cần phải lặp qua tất cả và trích xuất các giá trị cụ thể, nếu nó có sẵn trong đối tượng.Đọc các đối tượng JSON với Matlab

JSON (nguồn):

{ 
    "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 (nhập khẩu, 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) 

Vấn đề/Câu hỏi:

Như bạn thấy, chỉ Matlab đọc nội dung của dấu ngoặc/trường. Làm thế nào tôi có thể nhập TẤT CẢ các dấu ngoặc/lĩnh vực, ngay cả khi tôi không biết có bao nhiêu?

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' 

Cảm ơn bạn!

+2

Hãy xem ở đây: http://iso2mesh.sourceforge.net/cgi-bin/index.cgi?jsonlab Nguồn ở đây: https://github.com/fangq/jsonlab – 0xMB

+0

Một số khả năng để phân tích json: http : //undocumentedmatlab.com/blog/json-matlab-integration – Daniel

Trả lời

2

Bạn có thể thử phân tích cú pháp bằng cách sử dụng thư viện json khác, chẳng hạn như this one on file exchange.

Hoặc bạn có thể thử một số phương pháp được liệt kê trên this site, chẳng hạn như sử dụng tích hợp Java và .NET của MATLAB và tải với một trong các thư viện json của chúng. Là một lựa chọn thứ ba, vì phương pháp bạn đã hiển thị ở trên sẽ vui vẻ tải đối tượng đầu tiên trong chuỗi, bạn luôn có thể thực hiện một số phân tích trước chuỗi thủ công của chuỗi thành một chuỗi ô chứa một đối tượng đơn lẻ, và sau đó phân tích cú pháp đó.

4

Nếu tập tin của bạn có thể truy cập quahttp hoặc https, bạn có thể sử dụng chức năng webread từ Data Import and Export hộp công cụ. Nó tự động chuyển đổi các tệp JSON thành cấu trúc Matlab.

Có một chức năng decodeJSON trong hộp công cụ (MATLABROOT/toolbox/matlab/external/interfaces/webservices/restful/private/decodeJSON.m), nhưng sự giúp đỡ rõ ràng khẳng định rằng:

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

Tuy nhiên bạn có thể nhận được nguồn cảm hứng trong nội dung để xây dựng giải pháp của riêng bạn. Thật đáng tiếc là Mathworks đã không thực hiện chương trình này bên ngoài hộp công cụ.

Tốt nhất

6

Bạn đang cố gắng đọc tệp json, không hợp lệ. Tôi khuyên bạn nên sử dụng jsonlint để xác minh nhanh.

json của bạn trông giống như

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

Đó không phải là một cú pháp hợp lệ, vì nó mô tả hai đối tượng. Sau } đầu tiên trình phân tích cú pháp mong đợi kết thúc tệp vì tệp json chứa một đối tượng.

có thể sửa chữa là:

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

hoặc

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

Điều này đã giải quyết được sự cố của tôi. Người ta phải quan tâm đến cú pháp này ngay cả với chức năng webread. – Tik0

0

Nếu bạn chỉ muốn đọc toàn bộ file JSON vào MATLAB, và có một trình biên dịch C++ 11, bạn có thể sử dụng rất nhanh json_read chức năng mex.

Các vấn đề liên quan