diff --git a/examples/demo_jsonlab_basic.m b/examples/demo_jsonlab_basic.m index d094a64ee5eaf77eb3c629e75e65d6b2868ec7b5..43d70665a3984cd09724ee0b601f392c18f63707 100644 --- a/examples/demo_jsonlab_basic.m +++ b/examples/demo_jsonlab_basic.m @@ -157,5 +157,24 @@ fprintf(1,'%%=================================================\n\n') json2data=loadjson('{"ValidName":1, "_InvalidName":2, ":Field:":3, "项目":"绝密"}') +fprintf(1,'\n%%=================================================\n') +fprintf(1,'%% a 2D cell array\n') +fprintf(1,'%%=================================================\n\n') + +data2json={{1,{2,3}},{4,5},{6};{7},{8,9},{10}}; +savejson('data2json',data2json) +json2data=loadjson(ans) % only savejson works for cell arrays, loadjson has issues + +fprintf(1,'\n%%=================================================\n') +fprintf(1,'%% a 2D struct array\n') +fprintf(1,'%%=================================================\n\n') + +data2json=repmat(struct('idx',0,'data','structs'),[2,3]) +for i=1:6 + data2json(i).idx=i; +end +savejson('data2json',data2json) +json2data=loadjson(ans) + rand ('state',rngstate); diff --git a/loadjson.m b/loadjson.m index f11892c92933541478f0bf2e67dfd7a4a94e59e1..682b401cfa032f3eaf10f0853c1f7c28596326c8 100644 --- a/loadjson.m +++ b/loadjson.m @@ -189,27 +189,27 @@ global pos inStr isoct object = cell(0, 1); dim2=[]; if next_char ~= ']' - [endpos e1l e1r maxlevel]=matching_bracket(inStr,pos); + [endpos, e1l, e1r, maxlevel]=matching_bracket(inStr,pos); arraystr=['[' inStr(pos:endpos)]; arraystr=regexprep(arraystr,'"_NaN_"','NaN'); arraystr=regexprep(arraystr,'"([-+]*)_Inf_"','$1Inf'); - arraystr(find(arraystr==sprintf('\n')))=[]; - arraystr(find(arraystr==sprintf('\r')))=[]; + arraystr(arraystr==sprintf('\n'))=[]; + arraystr(arraystr==sprintf('\r'))=[]; %arraystr=regexprep(arraystr,'\s*,',','); % this is slow,sometimes needed if(~isempty(e1l) && ~isempty(e1r)) % the array is in 2D or higher D astr=inStr((e1l+1):(e1r-1)); astr=regexprep(astr,'"_NaN_"','NaN'); astr=regexprep(astr,'"([-+]*)_Inf_"','$1Inf'); - astr(find(astr==sprintf('\n')))=[]; - astr(find(astr==sprintf('\r')))=[]; - astr(find(astr==' '))=''; + astr(astr==sprintf('\n'))=[]; + astr(astr==sprintf('\r'))=[]; + astr(astr==' ')=''; if(isempty(find(astr=='[', 1))) % array is 2D dim2=length(sscanf(astr,'%f,',[1 inf])); end else % array is 1D astr=arraystr(2:end-1); - astr(find(astr==' '))=''; - [obj count errmsg nextidx]=sscanf(astr,'%f,',[1,inf]); + astr(astr==' ')=''; + [obj, count, errmsg, nextidx]=sscanf(astr,'%f,',[1,inf]); if(nextidx>=length(astr)-1) object=obj; pos=endpos; @@ -219,10 +219,10 @@ global pos inStr isoct end if(~isempty(dim2)) astr=arraystr; - astr(find(astr=='['))=''; - astr(find(astr==']'))=''; - astr(find(astr==' '))=''; - [obj count errmsg nextidx]=sscanf(astr,'%f,',inf); + astr(astr=='[')=''; + astr(astr==']')=''; + astr(astr==' ')=''; + [obj, count, errmsg, nextidx]=sscanf(astr,'%f,',inf); if(nextidx>=length(astr)-1) object=reshape(obj,dim2,numel(obj)/dim2)'; pos=endpos; @@ -478,7 +478,7 @@ while(pos<len) end error('unmatched quotation mark'); %%------------------------------------------------------------------------- -function [endpos e1l e1r maxlevel] = matching_bracket(str,pos) +function [endpos, e1l, e1r, maxlevel] = matching_bracket(str,pos) global arraytoken level=1; maxlevel=level; diff --git a/savejson.m b/savejson.m index ffb38712fcdcb430e23907b30341fe457cd0e893..56c9f178fb3ca966b9685f3b56972414c619d198 100644 --- a/savejson.m +++ b/savejson.m @@ -152,10 +152,14 @@ if(~iscell(item)) end dim=size(item); -len=numel(item); % let's handle 1D cell first -padding1=repmat(sprintf('\t'),1,level-1); +if(ndims(squeeze(item))>2) % for 3D or higher dimensions, flatten to 2D for now + item=reshape(item,dim(1),numel(item)/dim(1)); + dim=size(item); +end +len=numel(item); padding0=repmat(sprintf('\t'),1,level); -if(len>1) +padding2=repmat(sprintf('\t'),1,level+1); +if(len>1) if(~isempty(name)) txt=sprintf('%s"%s": [\n',padding0, checkname(name,varargin{:})); name=''; else @@ -168,9 +172,15 @@ elseif(len==0) txt=sprintf('%s[]',padding0); end end -for i=1:len - txt=sprintf('%s%s%s',txt,padding1,obj2json(name,item{i},level+(len>1),varargin{:})); - if(i<len) txt=sprintf('%s%s',txt,sprintf(',\n')); end +for j=1:dim(2) + if(dim(1)>1) txt=sprintf('%s%s[\n',txt,padding2); end + for i=1:dim(1) + txt=sprintf('%s%s',txt,obj2json(name,item{i,j},level+(dim(1)>1)+1,varargin{:})); + if(i<dim(1)) txt=sprintf('%s%s',txt,sprintf(',\n')); end + end + if(dim(1)>1) txt=sprintf('%s\n%s]',txt,padding2); end + if(j<dim(2)) txt=sprintf('%s%s',txt,sprintf(',\n')); end + %if(j==dim(2)) txt=sprintf('%s%s',txt,sprintf(',\n')); end end if(len>1) txt=sprintf('%s\n%s]',txt,padding0); end @@ -180,34 +190,42 @@ txt=''; if(~isstruct(item)) error('input is not a struct'); end +dim=size(item); +if(ndims(squeeze(item))>2) % for 3D or higher dimensions, flatten to 2D for now + item=reshape(item,dim(1),numel(item)/dim(1)); + dim=size(item); +end len=numel(item); -padding1=repmat(sprintf('\t'),1,level-1); padding0=repmat(sprintf('\t'),1,level); -sep=','; +padding2=repmat(sprintf('\t'),1,level+1); if(~isempty(name)) if(len>1) txt=sprintf('%s"%s": [\n',padding0,checkname(name,varargin{:})); end else if(len>1) txt=sprintf('%s[\n',padding0); end end -for e=1:len - names = fieldnames(item(e)); - if(~isempty(name) && len==1) - txt=sprintf('%s%s"%s": {\n',txt,repmat(sprintf('\t'),1,level+(len>1)), checkname(name,varargin{:})); - else - txt=sprintf('%s%s{\n',txt,repmat(sprintf('\t'),1,level+(len>1))); - end - if(~isempty(names)) - for i=1:length(names) - txt=sprintf('%s%s',txt,obj2json(names{i},getfield(item(e),... - names{i}),level+1+(len>1),varargin{:})); - if(i<length(names)) txt=sprintf('%s%s',txt,','); end +for j=1:dim(2) + if(dim(1)>1) txt=sprintf('%s%s[\n',txt,padding2); end + for i=1:dim(1) + names = fieldnames(item(i,j)); + if(~isempty(name) && len==1) + txt=sprintf('%s%s"%s": {\n',txt,repmat(sprintf('\t'),1,level+(dim(1)>1)+(len>1)), checkname(name,varargin{:})); + else + txt=sprintf('%s%s{\n',txt,repmat(sprintf('\t'),1,level+(dim(1)>1)+(len>1))); + end + if(~isempty(names)) + for e=1:length(names) + txt=sprintf('%s%s',txt,obj2json(names{e},getfield(item(i,j),... + names{e}),level+(dim(1)>1)+1+(len>1),varargin{:})); + if(e<length(names)) txt=sprintf('%s%s',txt,','); end txt=sprintf('%s%s',txt,sprintf('\n')); + end end + txt=sprintf('%s%s}',txt,repmat(sprintf('\t'),1,level+(dim(1)>1)+(len>1))); + if(i<dim(1)) txt=sprintf('%s%s',txt,sprintf(',\n')); end end - txt=sprintf('%s%s}',txt,repmat(sprintf('\t'),1,level+(len>1))); - if(e==len) sep=''; end - if(e<len) txt=sprintf('%s%s',txt,sprintf(',\n')); end + if(dim(1)>1) txt=sprintf('%s\n%s]',txt,padding2); end + if(j<dim(2)) txt=sprintf('%s%s',txt,sprintf(',\n')); end end if(len>1) txt=sprintf('%s\n%s]',txt,padding0); end @@ -339,7 +357,11 @@ if(isempty(mat)) return; end floatformat=jsonopt('FloatFormat','%.10g',varargin{:}); -formatstr=['[' repmat([floatformat ','],1,size(mat,2)-1) [floatformat sprintf('],\n')]]; +%if(numel(mat)>1) + formatstr=['[' repmat([floatformat ','],1,size(mat,2)-1) [floatformat sprintf('],\n')]]; +%else +% formatstr=[repmat([floatformat ','],1,size(mat,2)-1) [floatformat sprintf(',\n')]]; +%end if(nargin>=2 && size(mat,1)>1 && jsonopt('ArrayIndent',1,varargin{:})==1) formatstr=[repmat(sprintf('\t'),1,level) formatstr];