From cc4491d95bec910f867b9d07a54eb6633671ce26 Mon Sep 17 00:00:00 2001
From: Qianqian Fang <fangq@nmr.mgh.harvard.edu>
Date: Thu, 24 Oct 2019 23:49:17 -0400
Subject: [PATCH] avoid escaping base64 str, avoid double processing preencoded
 arrayzipdata

---
 savejson.m   | 12 ++++++++++--
 saveubjson.m |  3 ++-
 2 files changed, 12 insertions(+), 3 deletions(-)

diff --git a/savejson.m b/savejson.m
index de6ae0c..3b11282 100644
--- a/savejson.m
+++ b/savejson.m
@@ -496,7 +496,11 @@ else
     end
 end
 for e=1:len
-    val=escapejsonstring(item(e,:),varargin{:});
+    if(strcmp('_ArrayZipData_',decodevarname(name,varargin{1}.unpackhex))==0)
+        val=escapejsonstring(item(e,:),varargin{:});
+    else
+        val=item(e,:);
+    end
     if(len==1)
         obj=['"' decodevarname(name,varargin{1}.unpackhex) '": ' '"',val,'"'];
         if(isempty(name))
@@ -533,7 +537,8 @@ format=varargin{1}.formatversion;
 isnest=varargin{1}.nestarray;
 
 if(((isnest==0) && length(size(item))>2) || issparse(item) || ~isreal(item) || ...
-   (isempty(item) && any(size(item))) || varargin{1}.arraytostruct || (~isempty(dozip) && numel(item)>zipsize))
+   (isempty(item) && any(size(item))) || varargin{1}.arraytostruct || ...
+   (~isempty(dozip) && numel(item)>zipsize && strcmp('_ArrayZipData_',decodevarname(name,varargin{1}.unpackhex))==0))
     if(isempty(name))
     	txt=sprintf('%s{%s%s"_ArrayType_": "%s",%s%s"_ArraySize_": %s,%s',...
               padding1,nl,padding0,class(item),nl,padding0,regexprep(mat2str(size(item)),'\s+',','),nl);
@@ -750,6 +755,9 @@ end
 %%-------------------------------------------------------------------------
 function newstr=escapejsonstring(str,varargin)
 newstr=str;
+if(isempty(str) || isempty(regexp(str,'\W', 'once')))
+    return;
+end
 isoct=varargin{1}.isoctave;
 if(isoct)
    vv=sscanf(OCTAVE_VERSION,'%f');
diff --git a/saveubjson.m b/saveubjson.m
index 530e789..5809078 100644
--- a/saveubjson.m
+++ b/saveubjson.m
@@ -482,7 +482,8 @@ if(ismsgpack)
     isnest=1;
 end
 if((length(size(item))>2 && isnest==0)  || issparse(item) || ~isreal(item) || ...
-       varargin{1}.arraytostruct || (~isempty(dozip) && numel(item)>zipsize))
+       varargin{1}.arraytostruct || (~isempty(dozip) && numel(item)>zipsize ...
+       && strcmp('_ArrayZipData_',decodevarname(name,varargin{:}))==0))
       cid=I_(uint32(max(size(item))),Imarker,varargin{:});
       if(isempty(name))
     	txt=[Omarker{1} N_('_ArrayType_'),S_(class(item)),N_('_ArraySize_'),I_a(size(item),cid(1),Imarker,varargin{:}) ];
-- 
GitLab