Skip to content

Commit

Permalink
add patch provided by pjkoprowski to support MATLAB table, add RowNam…
Browse files Browse the repository at this point in the history
…es support, fix #29
  • Loading branch information
fangq committed Jul 12, 2018
1 parent f16cc57 commit 1597106
Showing 1 changed file with 40 additions and 4 deletions.
44 changes: 40 additions & 4 deletions savejson.m
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand All @@ -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)

Expand Down

0 comments on commit 1597106

Please sign in to comment.