diff --git a/loadjson.m b/loadjson.m index eaeb1b2f8b7be3f583273952815f94bffe3bb4d6..9fe09955dad9423f90dfa25b070c8ec055de24ff 100644 --- a/loadjson.m +++ b/loadjson.m @@ -129,7 +129,7 @@ function object = parse_object(varargin) end parse_char(':'); val = parse_value(varargin{:}); - eval( sprintf( 'object.%s = val;', valid_field(str) ) ); + object.(valid_field(str))=val; if next_char == '}' break; end @@ -156,7 +156,7 @@ global pos inStr isoct if next_char ~= ']' if(jsonopt('FastArrayParser',1,varargin{:})>=1 && arraydepth>=jsonopt('FastArrayParser',1,varargin{:})) - [endpos, e1l, e1r, maxlevel]=matching_bracket(inStr,pos); + [endpos, e1l, e1r]=matching_bracket(inStr,pos); arraystr=['[' inStr(pos:endpos)]; arraystr=regexprep(arraystr,'"_NaN_"','NaN'); arraystr=regexprep(arraystr,'"([-+]*)_Inf_"','$1Inf'); @@ -228,7 +228,7 @@ global pos inStr isoct object=cell2mat(object')'; if(iscell(oldobj) && isstruct(object) && numel(object)>1 && jsonopt('SimplifyCellArray',1,varargin{:})==0) object=oldobj; - elseif(size(object,1)>1 && ndims(object)==2) + elseif(size(object,1)>1 && ismatrix(object)) object=object'; end catch @@ -292,7 +292,8 @@ function str = parseStr(varargin) str = [str inStr(pos:esc(index_esc)-1)]; pos = esc(index_esc); end - nstr = length(str); switch inStr(pos) + nstr = length(str); + switch inStr(pos) case '"' pos = pos + 1; if(~isempty(str)) @@ -325,7 +326,8 @@ function str = parseStr(varargin) pos = pos + 5; end otherwise % should never happen - str(nstr+1) = inStr(pos), keyboard + str(nstr+1) = inStr(pos); + keyboard; pos = pos + 1; end end @@ -338,7 +340,7 @@ function num = parse_number(varargin) currstr=inStr(pos:min(pos+30,end)); if(isoct~=0) numstr=regexp(currstr,'^\s*-?(?:0|[1-9]\d*)(?:\.\d+)?(?:[eE][+\-]?\d+)?','end'); - [num, one] = sscanf(currstr, '%f', 1); + [num] = sscanf(currstr, '%f', 1); delta=numstr+1; else [num, one, err, delta] = sscanf(currstr, '%f', 1); @@ -418,12 +420,16 @@ global isoct str=sprintf('x0x%X_%s',char(str(1)),str(2:end)); end end - if(isempty(regexp(str,'[^0-9A-Za-z_]', 'once' ))) return; end + if(isempty(regexp(str,'[^0-9A-Za-z_]', 'once' ))) + return; + end if(~isoct) str=regexprep(str,'([^0-9A-Za-z_])','_0x${sprintf(''%X'',unicode2native($1))}_'); else pos=regexp(str,'[^0-9A-Za-z_]'); - if(isempty(pos)) return; end + if(isempty(pos)) + return; + end str0=str; pos0=[0 pos(:)' length(str)]; str=''; @@ -465,14 +471,18 @@ while(pos<=len) c=tokens(pos); if(c==']') level=level-1; - if(isempty(e1r)) e1r=bpos(pos); end + if(isempty(e1r)) + e1r=bpos(pos); + end if(level==0) endpos=bpos(pos); return end end if(c=='[') - if(isempty(e1l)) e1l=bpos(pos); end + if(isempty(e1l)) + e1l=bpos(pos); + end level=level+1; maxlevel=max(maxlevel,level); end diff --git a/loadubjson.m b/loadubjson.m index 62b8ff7daf6d9023113f503d264e470ed04cd4be..5bed1669353c9cfae4bed3fb65b4c3685891496f 100644 --- a/loadubjson.m +++ b/loadubjson.m @@ -94,17 +94,6 @@ if(jsoncount==1 && iscell(data)) data=data{1}; end -%% -function newdata=parse_collection(id,data,obj) - -if(jsoncount>0 && exist('data','var')) - if(~iscell(data)) - newdata=cell(1); - newdata{1}=data; - data=newdata; - end -end - %%------------------------------------------------------------------------- function object = parse_object(varargin) parse_char('{'); @@ -133,7 +122,7 @@ function object = parse_object(varargin) %parse_char(':'); val = parse_value(varargin{:}); num=num+1; - eval( sprintf( 'object.%s = val;', valid_field(str) ) ); + object.(valid_field(str))=val; if next_char == '}' || (count>=0 && num>=count) break; end @@ -181,7 +170,7 @@ adv=double(len*count); function object = parse_array(varargin) % JSON array is written in row-major order -global pos inStr isoct +global pos inStr parse_char('['); object = cell(0, 1); dim=[]; @@ -234,7 +223,7 @@ global pos inStr isoct object=cell2mat(object')'; if(iscell(oldobj) && isstruct(object) && numel(object)>1 && jsonopt('SimplifyCellArray',1,varargin{:})==0) object=oldobj; - elseif(size(object,1)>1 && ndims(object)==2) + elseif(size(object,1)>1 && ismatrix(object)) object=object'; end catch @@ -334,7 +323,7 @@ function num = parse_number(varargin) %%------------------------------------------------------------------------- function val = parse_value(varargin) - global pos inStr len + global pos inStr switch(inStr(pos)) case {'S','C','H'} @@ -391,12 +380,16 @@ global isoct str=sprintf('x0x%X_%s',char(str(1)),str(2:end)); end end - if(isempty(regexp(str,'[^0-9A-Za-z_]', 'once' ))) return; end + if(isempty(regexp(str,'[^0-9A-Za-z_]', 'once' ))) + return; + end if(~isoct) str=regexprep(str,'([^0-9A-Za-z_])','_0x${sprintf(''%X'',unicode2native($1))}_'); else pos=regexp(str,'[^0-9A-Za-z_]'); - if(isempty(pos)) return; end + if(isempty(pos)) + return; + end str0=str; pos0=[0 pos(:)' length(str)]; str=''; @@ -438,14 +431,18 @@ while(pos<=len) c=tokens(pos); if(c==']') level=level-1; - if(isempty(e1r)) e1r=bpos(pos); end + if(isempty(e1r)) + e1r=bpos(pos); + end if(level==0) endpos=bpos(pos); return end end if(c=='[') - if(isempty(e1l)) e1l=bpos(pos); end + if(isempty(e1l)) + e1l=bpos(pos); + end level=level+1; maxlevel=max(maxlevel,level); end diff --git a/savejson.m b/savejson.m index 4e16d58086ef618ca8fa8e4f57f4d26856c1e590..57125fe0b9c297eef4c2c8a1da830d10d0dc1ee9 100644 --- a/savejson.m +++ b/savejson.m @@ -194,16 +194,26 @@ elseif(len==0) end end for j=1:dim(2) - if(dim(1)>1) txt=sprintf('%s%s[%s',txt,padding2,nl); end + if(dim(1)>1) + txt=sprintf('%s%s[%s',txt,padding2,nl); + end for i=1:dim(1) txt=sprintf('%s%s',txt,obj2json(name,item{i,j},level+(dim(1)>1)+(len>1),varargin{:})); - if(i<dim(1)) txt=sprintf('%s%s',txt,sprintf(',%s',nl)); end + if(i<dim(1)) + txt=sprintf('%s%s',txt,sprintf(',%s',nl)); + end + end + if(dim(1)>1) + txt=sprintf('%s%s%s]',txt,nl,padding2); + end + if(j<dim(2)) + txt=sprintf('%s%s',txt,sprintf(',%s',nl)); end - if(dim(1)>1) txt=sprintf('%s%s%s]',txt,nl,padding2); end - if(j<dim(2)) txt=sprintf('%s%s',txt,sprintf(',%s',nl)); end %if(j==dim(2)) txt=sprintf('%s%s',txt,sprintf(',%s',nl)); end end -if(len>1) txt=sprintf('%s%s%s]',txt,nl,padding0); end +if(len>1) + txt=sprintf('%s%s%s]',txt,nl,padding0); +end %%------------------------------------------------------------------------- function txt=struct2json(name,item,level,varargin) @@ -234,12 +244,18 @@ if(isempty(item)) return; end if(~isempty(name)) - if(forcearray) txt=sprintf('%s"%s": [%s',padding0,checkname(name,varargin{:}),nl); end + if(forcearray) + txt=sprintf('%s"%s": [%s',padding0,checkname(name,varargin{:}),nl); + end else - if(forcearray) txt=sprintf('%s[%s',padding0,nl); end + if(forcearray) + txt=sprintf('%s[%s',padding0,nl); + end end for j=1:dim(2) - if(dim(1)>1) txt=sprintf('%s%s[%s',txt,padding2,nl); end + if(dim(1)>1) + txt=sprintf('%s%s[%s',txt,padding2,nl); + end for i=1:dim(1) names = fieldnames(item(i,j)); if(~isempty(name) && len==1 && ~forcearray) @@ -249,19 +265,29 @@ for j=1:dim(2) 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+forcearray,varargin{:})); - if(e<length(names)) txt=sprintf('%s%s',txt,','); end + txt=sprintf('%s%s',txt,obj2json(names{e},item(i,j).(names{e}),... + level+(dim(1)>1)+1+forcearray,varargin{:})); + if(e<length(names)) + txt=sprintf('%s%s',txt,','); + end txt=sprintf('%s%s',txt,nl); end end txt=sprintf('%s%s}',txt,padding1); - if(i<dim(1)) txt=sprintf('%s%s',txt,sprintf(',%s',nl)); end + if(i<dim(1)) + txt=sprintf('%s%s',txt,sprintf(',%s',nl)); + end end - if(dim(1)>1) txt=sprintf('%s%s%s]',txt,nl,padding2); end - if(j<dim(2)) txt=sprintf('%s%s',txt,sprintf(',%s',nl)); end + if(dim(1)>1) + txt=sprintf('%s%s%s]',txt,nl,padding2); + end + if(j<dim(2)) + txt=sprintf('%s%s',txt,sprintf(',%s',nl)); + end +end +if(forcearray) + txt=sprintf('%s%s%s]',txt,nl,padding0); end -if(forcearray) txt=sprintf('%s%s%s]',txt,nl,padding0); end %%------------------------------------------------------------------------- function txt=str2json(name,item,level,varargin) @@ -279,24 +305,33 @@ nl=ws.newline; sep=ws.sep; if(~isempty(name)) - if(len>1) txt=sprintf('%s"%s": [%s',padding1,checkname(name,varargin{:}),nl); end + if(len>1) + txt=sprintf('%s"%s": [%s',padding1,checkname(name,varargin{:}),nl); + end else - if(len>1) txt=sprintf('%s[%s',padding1,nl); end + if(len>1) + txt=sprintf('%s[%s',padding1,nl); + end end -isoct=jsonopt('IsOctave',0,varargin{:}); for e=1:len val=escapejsonstring(item(e,:)); if(len==1) obj=['"' checkname(name,varargin{:}) '": ' '"',val,'"']; - if(isempty(name)) obj=['"',val,'"']; end + if(isempty(name)) + obj=['"',val,'"']; + end txt=sprintf('%s%s%s%s',txt,padding1,obj); else txt=sprintf('%s%s%s%s',txt,padding0,['"',val,'"']); end - if(e==len) sep=''; end + if(e==len) + sep=''; + end txt=sprintf('%s%s',txt,sep); end -if(len>1) txt=sprintf('%s%s%s%s',txt,nl,padding1,']'); end +if(len>1) + txt=sprintf('%s%s%s%s',txt,nl,padding1,']'); +end %%------------------------------------------------------------------------- function txt=mat2json(name,item,level,varargin) @@ -441,7 +476,9 @@ if(isunpack) else pos=regexp(name,'(^x|_){1}0x([0-9a-fA-F]+)_','start'); pend=regexp(name,'(^x|_){1}0x([0-9a-fA-F]+)_','end'); - if(isempty(pos)) return; end + if(isempty(pos)) + return; + end str0=name; pos0=[0 pend(:)' length(name)]; newname=''; @@ -460,7 +497,9 @@ newstr=str; isoct=exist('OCTAVE_VERSION','builtin'); if(isoct) vv=sscanf(OCTAVE_VERSION,'%f'); - if(vv(1)>=3.8) isoct=0; end + if(vv(1)>=3.8) + isoct=0; + end end if(isoct) escapechars={'\\','\"','\/','\a','\f','\n','\r','\t','\v'}; diff --git a/saveubjson.m b/saveubjson.m index a9f384c85674f6ce88a9831f6aa9373b5a0312ca..558a1160562aea261678b5016f0d8a6d0de541ca 100644 --- a/saveubjson.m +++ b/saveubjson.m @@ -160,13 +160,19 @@ elseif(len==0) end end for j=1:dim(2) - if(dim(1)>1) txt=[txt '[']; end + if(dim(1)>1) + txt=[txt '[']; + end for i=1:dim(1) txt=[txt obj2ubjson(name,item{i,j},level+(len>1),varargin{:})]; end - if(dim(1)>1) txt=[txt ']']; end + if(dim(1)>1) + txt=[txt ']']; + end +end +if(len>1) + txt=[txt ']']; end -if(len>1) txt=[txt ']']; end %%------------------------------------------------------------------------- function txt=struct2ubjson(name,item,level,varargin) @@ -183,12 +189,18 @@ len=numel(item); forcearray= (len>1 || (jsonopt('NoRowBracket',1,varargin{:})==0 && level>0)); if(~isempty(name)) - if(forcearray) txt=[N_(checkname(name,varargin{:})) '[']; end + if(forcearray) + txt=[N_(checkname(name,varargin{:})) '[']; + end else - if(forcearray) txt='['; end + if(forcearray) + txt='['; + end end for j=1:dim(2) - if(dim(1)>1) txt=[txt '[']; end + if(dim(1)>1) + txt=[txt '[']; + end for i=1:dim(1) names = fieldnames(item(i,j)); if(~isempty(name) && len==1 && ~forcearray) @@ -198,15 +210,19 @@ for j=1:dim(2) end if(~isempty(names)) for e=1:length(names) - txt=[txt obj2ubjson(names{e},getfield(item(i,j),... - names{e}),level+(dim(1)>1)+1+forcearray,varargin{:})]; + txt=[txt obj2ubjson(names{e},item(i,j).(names{e}),... + level+(dim(1)>1)+1+forcearray,varargin{:})]; end end txt=[txt '}']; end - if(dim(1)>1) txt=[txt ']']; end + if(dim(1)>1) + txt=[txt ']']; + end +end +if(forcearray) + txt=[txt ']']; end -if(forcearray) txt=[txt ']']; end %%------------------------------------------------------------------------- function txt=str2ubjson(name,item,level,varargin) @@ -218,22 +234,29 @@ item=reshape(item, max(size(item),[1 0])); len=size(item,1); if(~isempty(name)) - if(len>1) txt=[N_(checkname(name,varargin{:})) '[']; end + if(len>1) + txt=[N_(checkname(name,varargin{:})) '[']; + end else - if(len>1) txt='['; end + if(len>1) + txt='['; + end end -isoct=jsonopt('IsOctave',0,varargin{:}); for e=1:len val=item(e,:); if(len==1) obj=[N_(checkname(name,varargin{:})) '' '',S_(val),'']; - if(isempty(name)) obj=['',S_(val),'']; end + if(isempty(name)) + obj=['',S_(val),'']; + end txt=[txt,'',obj]; else txt=[txt,'',['',S_(val),'']]; end end -if(len>1) txt=[txt ']']; end +if(len>1) + txt=[txt ']']; +end %%------------------------------------------------------------------------- function txt=mat2ubjson(name,item,level,varargin) @@ -311,9 +334,6 @@ if(isempty(mat)) txt='Z'; return; end -if(size(mat,1)==1) - level=level-1; -end type=''; hasnegtive=(mat<0); if(isa(mat,'integer') || isinteger(mat) || (isfloat(mat) && all(mod(mat(:),1) == 0))) @@ -325,11 +345,11 @@ if(isa(mat,'integer') || isinteger(mat) || (isfloat(mat) && all(mod(mat(:),1) == if(isempty(type)) % todo - need to consider negative ones separately id= histc(abs(max(mat(:))),[0 2^7 2^15 2^31 2^63]); - if(isempty(find(id))) + if(isempty(id~=0)) error('high-precision data is not yet supported'); end key='iIlL'; - type=key(find(id)); + type=key(id~=0); end txt=[I_a(mat(:),type,size(mat))]; elseif(islogical(mat)) @@ -373,7 +393,9 @@ if(isunpack) else pos=regexp(name,'(^x|_){1}0x([0-9a-fA-F]+)_','start'); pend=regexp(name,'(^x|_){1}0x([0-9a-fA-F]+)_','end'); - if(isempty(pos)) return; end + if(isempty(pos)) + return; + end str0=name; pos0=[0 pend(:)' length(name)]; newname='';