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];