Skip to content
Snippets Groups Projects
Commit 7ec9fe0c authored by Qianqian Fang's avatar Qianqian Fang
Browse files

accept options in loadjson

git-svn-id: http://svn.code.sf.net/p/iso2mesh/code/trunk/jsonlab@334 786e58fb-9377-0410-9ff7-e4ac0ac0635c
parent 98c90a91
Branches
Tags
No related merge requests found
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 % parse a JSON (JavaScript Object Notation) file or string
% %
...@@ -16,6 +18,9 @@ function data = loadjson(fname) ...@@ -16,6 +18,9 @@ function data = loadjson(fname)
% input: % input:
% fname: input file name, if fname contains "{}" or "[]", fname % 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: % output:
% dat: a cell array, where {...} blocks are converted into cell arrays, % dat: a cell array, where {...} blocks are converted into cell arrays,
...@@ -47,13 +52,14 @@ arraytoken=find(inStr=='[' | inStr==']' | inStr=='"'); ...@@ -47,13 +52,14 @@ arraytoken=find(inStr=='[' | inStr==']' | inStr=='"');
esc = find(inStr=='"' | inStr=='\' ); % comparable to: regexp(inStr, '["\\]'); esc = find(inStr=='"' | inStr=='\' ); % comparable to: regexp(inStr, '["\\]');
index_esc = 1; len_esc = length(esc); index_esc = 1; len_esc = length(esc);
opt=varargin2struct(varargin{:});
jsoncount=1; jsoncount=1;
while pos <= len while pos <= len
switch(next_char) switch(next_char)
case '{' case '{'
data{jsoncount} = parse_object; data{jsoncount} = parse_object(opt);
case '[' case '['
data{jsoncount} = parse_array; data{jsoncount} = parse_array(opt);
otherwise otherwise
error_pos('Outer level structure must be an object or an array'); error_pos('Outer level structure must be an object or an array');
end end
...@@ -145,17 +151,17 @@ if(~isempty(strmatch('x_ArrayType_',fn)) && ~isempty(strmatch('x_ArrayData_',fn) ...@@ -145,17 +151,17 @@ if(~isempty(strmatch('x_ArrayType_',fn)) && ~isempty(strmatch('x_ArrayData_',fn)
end end
%%------------------------------------------------------------------------- %%-------------------------------------------------------------------------
function object = parse_object function object = parse_object(varargin)
parse_char('{'); parse_char('{');
object = []; object = [];
if next_char ~= '}' if next_char ~= '}'
while 1 while 1
str = parseStr; str = parseStr(varargin{:});
if isempty(str) if isempty(str)
error_pos('Name of value at position %d cannot be empty'); error_pos('Name of value at position %d cannot be empty');
end end
parse_char(':'); parse_char(':');
val = parse_value; val = parse_value(varargin{:});
eval( sprintf( 'object.%s = val;', valid_field(str) ) ); eval( sprintf( 'object.%s = val;', valid_field(str) ) );
if next_char == '}' if next_char == '}'
break; break;
...@@ -167,7 +173,7 @@ function object = parse_object ...@@ -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 global pos inStr isoct
parse_char('['); parse_char('[');
object = cell(0, 1); object = cell(0, 1);
...@@ -187,7 +193,7 @@ global pos inStr isoct ...@@ -187,7 +193,7 @@ global pos inStr isoct
pos=endpos; pos=endpos;
catch catch
while 1 while 1
val = parse_value; val = parse_value(varargin{:});
object{end+1} = val; object{end+1} = val;
if next_char == ']' if next_char == ']'
break; break;
...@@ -237,7 +243,7 @@ function skip_whitespace ...@@ -237,7 +243,7 @@ function skip_whitespace
end end
%%------------------------------------------------------------------------- %%-------------------------------------------------------------------------
function str = parseStr function str = parseStr(varargin)
global pos inStr len esc index_esc len_esc global pos inStr len esc index_esc len_esc
% len, ns = length(inStr), keyboard % len, ns = length(inStr), keyboard
if inStr(pos) ~= '"' if inStr(pos) ~= '"'
...@@ -299,7 +305,7 @@ function str = parseStr ...@@ -299,7 +305,7 @@ function str = parseStr
%%------------------------------------------------------------------------- %%-------------------------------------------------------------------------
function num = parse_number function num = parse_number(varargin)
global pos inStr len isoct global pos inStr len isoct
currstr=inStr(pos:end); currstr=inStr(pos:end);
numstr=0; numstr=0;
...@@ -317,22 +323,22 @@ function num = parse_number ...@@ -317,22 +323,22 @@ function num = parse_number
%%------------------------------------------------------------------------- %%-------------------------------------------------------------------------
function val = parse_value function val = parse_value(varargin)
global pos inStr len global pos inStr len
true = 1; false = 0; true = 1; false = 0;
switch(inStr(pos)) switch(inStr(pos))
case '"' case '"'
val = parseStr; val = parseStr(varargin{:});
return; return;
case '[' case '['
val = parse_array; val = parse_array(varargin{:});
return; return;
case '{' case '{'
val = parse_object; val = parse_object(varargin{:});
return; return;
case {'-','0','1','2','3','4','5','6','7','8','9'} case {'-','0','1','2','3','4','5','6','7','8','9'}
val = parse_number; val = parse_number(varargin{:});
return; return;
case 't' case 't'
if pos+3 <= len && strcmpi(inStr(pos:pos+3), 'true') if pos+3 <= len && strcmpi(inStr(pos:pos+3), 'true')
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment