From 1597106f3b81ef6c0a40d01921cfd92a21714cce Mon Sep 17 00:00:00 2001 From: Qianqian Fang Date: Thu, 12 Jul 2018 13:41:28 -0400 Subject: [PATCH] add patch provided by pjkoprowski to support MATLAB table, add RowNames support, fix #29 --- savejson.m | 44 ++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 40 insertions(+), 4 deletions(-) diff --git a/savejson.m b/savejson.m index 422890f..25d9f49 100644 --- a/savejson.m +++ b/savejson.m @@ -173,8 +173,12 @@ 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 @@ %%------------------------------------------------------------------------- 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 @@ 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)