diff --git a/loadjson.m b/loadjson.m index 9e67964a4a4e27a1a1462ee61f37084f9aca4358..7c885e78bc4b318a84d36d1c5aca29e8295863d7 100644 --- a/loadjson.m +++ b/loadjson.m @@ -1,6 +1,8 @@ -function data = loadjson(fname) +function data = loadjson(fname,varargin) % -% data=loadjson(fname) +% data=loadjson(fname,opt) +% or +% data=loadjson(fname,'param1',value1,'param2',value2,...) % % parse a JSON (JavaScript Object Notation) file or string % @@ -15,7 +17,10 @@ function data = loadjson(fname) % % input: % fname: input file name, if fname contains "{}" or "[]", fname -% will be interpreted as a JSON string +% will be interpreted as a JSON string +% opt: a struct to store parsing options, opt can be replaced by +% a list of ('param',value) pairs. The param string is equivallent +% to a field in opt. % % output: % dat: a cell array, where {...} blocks are converted into cell arrays, @@ -47,13 +52,14 @@ arraytoken=find(inStr=='[' | inStr==']' | inStr=='"'); esc = find(inStr=='"' | inStr=='\' ); % comparable to: regexp(inStr, '["\\]'); index_esc = 1; len_esc = length(esc); +opt=varargin2struct(varargin{:}); jsoncount=1; while pos <= len switch(next_char) case '{' - data{jsoncount} = parse_object; + data{jsoncount} = parse_object(opt); case '[' - data{jsoncount} = parse_array; + data{jsoncount} = parse_array(opt); otherwise error_pos('Outer level structure must be an object or an array'); end @@ -145,17 +151,17 @@ if(~isempty(strmatch('x_ArrayType_',fn)) && ~isempty(strmatch('x_ArrayData_',fn) end %%------------------------------------------------------------------------- -function object = parse_object +function object = parse_object(varargin) parse_char('{'); object = []; if next_char ~= '}' while 1 - str = parseStr; + str = parseStr(varargin{:}); if isempty(str) error_pos('Name of value at position %d cannot be empty'); end parse_char(':'); - val = parse_value; + val = parse_value(varargin{:}); eval( sprintf( 'object.%s = val;', valid_field(str) ) ); if next_char == '}' break; @@ -167,7 +173,7 @@ function object = parse_object %%------------------------------------------------------------------------- -function object = parse_array % JSON array is written in row-major order +function object = parse_array(varargin) % JSON array is written in row-major order global pos inStr isoct parse_char('['); object = cell(0, 1); @@ -187,7 +193,7 @@ global pos inStr isoct pos=endpos; catch while 1 - val = parse_value; + val = parse_value(varargin{:}); object{end+1} = val; if next_char == ']' break; @@ -237,7 +243,7 @@ function skip_whitespace end %%------------------------------------------------------------------------- -function str = parseStr +function str = parseStr(varargin) global pos inStr len esc index_esc len_esc % len, ns = length(inStr), keyboard if inStr(pos) ~= '"' @@ -299,7 +305,7 @@ function str = parseStr %%------------------------------------------------------------------------- -function num = parse_number +function num = parse_number(varargin) global pos inStr len isoct currstr=inStr(pos:end); numstr=0; @@ -317,22 +323,22 @@ function num = parse_number %%------------------------------------------------------------------------- -function val = parse_value +function val = parse_value(varargin) global pos inStr len true = 1; false = 0; switch(inStr(pos)) case '"' - val = parseStr; + val = parseStr(varargin{:}); return; case '[' - val = parse_array; + val = parse_array(varargin{:}); return; case '{' - val = parse_object; + val = parse_object(varargin{:}); return; case {'-','0','1','2','3','4','5','6','7','8','9'} - val = parse_number; + val = parse_number(varargin{:}); return; case 't' if pos+3 <= len && strcmpi(inStr(pos:pos+3), 'true')