diff --git a/savejson.m b/savejson.m index 422890fcbd286150f9f312c17e34c6b6b2dc57c4..25d9f490f040316d932e8a82b1995adc9d22b41c 100644 --- a/savejson.m +++ b/savejson.m @@ -173,8 +173,12 @@ elseif(ischar(item)) txt=str2json(name,item,level,varargin{:}); elseif(isa(item,'string')) txt=str2json(name,item{:},level,varargin{:}); -elseif(isobject(item)) - txt=matlabobject2json(name,item,level,varargin{:}); +elseif(isobject(item)) + if(~exist('OCTAVE_VERSION','builtin') && istable(item)) + txt=matlabtable2json(name,item,level,varargin{:}); + else + txt=matlabobject2json(name,item,level,varargin{:}); + end else txt=mat2json(name,item,level,varargin{:}); end @@ -434,8 +438,13 @@ txt=sprintf('%s%s%s',txt,padding1,'}'); %%------------------------------------------------------------------------- function txt=matlabobject2json(name,item,level,varargin) -st = struct(); -if numel(item) > 0 %non-empty object +if numel(item) == 0 %empty object + st = struct(); +elseif numel(item) == 1 % + st = struct(); + txt = str2json(name, char(item), level, varargin(:)); + return +else % "st = struct(item);" would produce an inmutable warning, because it % make the protected and private properties visible. Instead we get the % visible properties @@ -448,6 +457,33 @@ if numel(item) > 0 %non-empty object end txt=struct2json(name,st,level,varargin{:}); +%%------------------------------------------------------------------------- +function txt=matlabtable2json(name,item,level,varargin) +if numel(item) == 0 %empty object + st = struct(); +else + % "st = struct(item);" would produce an inmutable warning, because it + % make the protected and private properties visible. Instead we get the + % visible properties + st = struct(); + propertynames = properties(item); + if(isfield(item.Properties,'RowNames') && ~isempty(item.Properties.RowNames)) + rownames=item.Properties.RowNames; + for p = 1:(numel(propertynames)-1) + for j = 1:size(item(:,p),1) + st.(rownames{j}).(propertynames{p}) = item{j,p}; + end + end + else + for p = 1:(numel(propertynames)-1) + for j = 1:size(item(:,p),1) + st(j).(propertynames{p}) = item{j,p}; + end + end + end +end +txt=struct2json(name,st,level,varargin{:}); + %%------------------------------------------------------------------------- function txt=matdata2json(mat,level,varargin)