diff --git a/ChangeLog.txt b/ChangeLog.txt index 2c6290dee7052fe55e2496c58046cd3fb9a9e4db..cf7f8f883077cec21f054a36c28a618651f557aa 100644 --- a/ChangeLog.txt +++ b/ChangeLog.txt @@ -6,6 +6,11 @@ JSONlab ChangeLog (key features marked by *): +== JSONlab 1.0.0-RC2 (codename: Optimus - RC2), FangQ <fangq (at) nmr.mgh.harvard.edu> == + + 2014/11/17 add Compact option in savejson to output compact JSON format + 2014/11/17 add FastArrayParser in loadjson to specify fast parser applicable levels + == JSONlab 1.0.0-RC1 (codename: Optimus - RC1), FangQ <fangq (at) nmr.mgh.harvard.edu> == 2014/09/17 fix several compatibility issues when running on octave versions 3.2-3.8 diff --git a/README.txt b/README.txt index 0085019fe421691bf05c0db8d93169075abe181f..63e001e02bfa2fc238627814de2961f8c32bf72a 100644 --- a/README.txt +++ b/README.txt @@ -5,7 +5,7 @@ *Copyright (c) 2011-2014 Qianqian Fang <fangq at nmr.mgh.harvard.edu> *License: BSD or GNU General Public License version 3 (GPL v3), see License*.txt -*Version: 1.0.0-RC1 (Optimus - RC1) +*Version: 1.0.0-RC1 (Optimus - RC2) ------------------------------------------------------------------------------- diff --git a/examples/jsonlab_selftest.m b/examples/jsonlab_selftest.m index ab2c038b9584febf44393f205c5466b60344803a..27aee244c4e2a8013f6c3ad1f2d8731ad33893c4 100644 --- a/examples/jsonlab_selftest.m +++ b/examples/jsonlab_selftest.m @@ -8,6 +8,7 @@ for i=1:4 fprintf(1,'===============================================\n>> %s\n',fname); json=savejson('data',loadjson(fname)); fprintf(1,'%s\n',json); + fprintf(1,'%s\n',savejson('data',loadjson(fname),'Compact',1)); data=loadjson(json); savejson('data',data,'selftest.json'); data=loadjson('selftest.json'); @@ -19,9 +20,8 @@ for i=1:4 fprintf(1,'===============================================\n>> %s\n',fname); json=saveubjson('data',loadjson(fname)); fprintf(1,'%s\n',json); - data=loadubjson(json) - savejson('',data) -i + data=loadubjson(json); + savejson('',data); saveubjson('data',data,'selftest.ubj'); data=loadubjson('selftest.ubj'); end diff --git a/savejson.m b/savejson.m index eafafca9bd9e09035eb9a267c4722c90de90d578..54bcaed70404c68a6968f7d59e86f44934258266 100644 --- a/savejson.m +++ b/savejson.m @@ -109,11 +109,17 @@ end if((isstruct(obj) || iscell(obj))&& isempty(rootname) && forceroot) rootname='root'; end -nl=sprintf('\n'); + +whitespaces=struct('tab',sprintf('\t'),'newline',sprintf('\n'),'sep',sprintf(',\n')); if(jsonopt('Compact',0,opt)==1) - nl=''; + whitespaces=struct('tab','','newline','','sep',','); +end +if(~isfield(opt,'whitespaces_')) + opt.whitespaces_=whitespaces; end +nl=whitespaces.newline; + json=obj2json(rootname,obj,rootlevel,opt); if(rootisarray) json=sprintf('%s%s',json,nl); @@ -164,12 +170,10 @@ if(ndims(squeeze(item))>2) % for 3D or higher dimensions, flatten to 2D for now dim=size(item); end len=numel(item); -padding0=repmat(sprintf('\t'),1,level); -padding2=repmat(sprintf('\t'),1,level+1); -nl=sprintf('\n'); -if(jsonopt('Compact',0,varargin{:})==1) - padding0='';padding2='';nl=''; -end +ws=jsonopt('whitespaces_',struct('tab',sprintf('\t'),'newline',sprintf('\n'),'sep',sprintf(',\n')),varargin{:}); +padding0=repmat(ws.tab,1,level); +padding2=repmat(ws.tab,1,level+1); +nl=ws.newline; if(len>1) if(~isempty(name)) txt=sprintf('%s"%s": [%s',padding0, checkname(name,varargin{:}),nl); name=''; @@ -207,13 +211,12 @@ if(ndims(squeeze(item))>2) % for 3D or higher dimensions, flatten to 2D for now dim=size(item); end len=numel(item); -padding0=repmat(sprintf('\t'),1,level); -padding2=repmat(sprintf('\t'),1,level+1); -padding1=repmat(sprintf('\t'),1,level+(dim(1)>1)+(len>1)); -nl=sprintf('\n'); -if(jsonopt('Compact',0,varargin{:})==1) - padding0='';padding1='';padding2='';nl=''; -end +ws=struct('tab',sprintf('\t'),'newline',sprintf('\n')); +ws=jsonopt('whitespaces_',ws,varargin{:}); +padding0=repmat(ws.tab,1,level); +padding2=repmat(ws.tab,1,level+1); +padding1=repmat(ws.tab,1,level+(dim(1)>1)+(len>1)); +nl=ws.newline; if(~isempty(name)) if(len>1) txt=sprintf('%s"%s": [%s',padding0,checkname(name,varargin{:}),nl); end @@ -253,15 +256,12 @@ if(~ischar(item)) end item=reshape(item, max(size(item),[1 0])); len=size(item,1); -nl=sprintf('\n'); -padding1=repmat(sprintf('\t'),1,level); -padding0=repmat(sprintf('\t'),1,level+1); -if(jsonopt('Compact',0,varargin{:})==1) - padding0=''; - padding1=''; - nl=''; -end -sep=sprintf(',%s',nl); +ws=struct('tab',sprintf('\t'),'newline',sprintf('\n'),'sep',sprintf(',\n')); +ws=jsonopt('whitespaces_',ws,varargin{:}); +padding1=repmat(ws.tab,1,level); +padding0=repmat(ws.tab,1,level+1); +nl=ws.newline; +sep=ws.sep; if(~isempty(name)) if(len>1) txt=sprintf('%s"%s": [%s',padding1,checkname(name,varargin{:}),nl); end @@ -297,13 +297,12 @@ function txt=mat2json(name,item,level,varargin) if(~isnumeric(item) && ~islogical(item)) error('input is not an array'); end -nl=sprintf('\n'); -padding1=repmat(sprintf('\t'),1,level); -padding0=repmat(sprintf('\t'),1,level+1); -if(jsonopt('Compact',0,varargin{:})==1) - padding0='';padding1='';nl=''; -end -sep=sprintf(',%s',nl); +ws=struct('tab',sprintf('\t'),'newline',sprintf('\n'),'sep',sprintf(',\n')); +ws=jsonopt('whitespaces_',ws,varargin{:}); +padding1=repmat(ws.tab,1,level); +padding0=repmat(ws.tab,1,level+1); +nl=ws.newline; +sep=ws.sep; if(length(size(item))>2 || issparse(item) || ~isreal(item) || ... isempty(item) ||jsonopt('ArrayToStruct',0,varargin{:})) @@ -369,13 +368,12 @@ txt=sprintf('%s%s%s',txt,padding1,'}'); %%------------------------------------------------------------------------- function txt=matdata2json(mat,level,varargin) -if(jsonopt('Compact',0,varargin{:})==1) - tab=''; - nl=''; -else - tab=sprintf('\t'); - nl=sprintf('\n'); -end + +ws=struct('tab',sprintf('\t'),'newline',sprintf('\n'),'sep',sprintf(',\n')); +ws=jsonopt('whitespaces_',ws,varargin{:}); +tab=ws.tab; +nl=ws.newline; + if(size(mat,1)==1) pre=''; post='';