diff --git a/decodevarname.m b/decodevarname.m
index 66298d2b593b2634148a8e3d0b66237fdc06787b..f1ab1410dab8eb2d553e8a75d5485783bb314afb 100644
--- a/decodevarname.m
+++ b/decodevarname.m
@@ -46,6 +46,10 @@ if(isunpack)
         h2u=@hex2unicode;
         newname=regexprep(name,'(^x|_){1}0x([0-9a-fA-F]+)_','${h2u($2)}');
     else
+        if(isunpack && strcmp(name,'x0x0_'))
+            newname='';
+            return;
+        end
         pos=regexp(name,'(^x|_){1}0x([0-9a-fA-F]+)_','start');
         pend=regexp(name,'(^x|_){1}0x([0-9a-fA-F]+)_','end');
         if(isempty(pos))
diff --git a/loadbj.m b/loadbj.m
index 86ffa60eab6258e255c8a57e6fd1f319d37f5b65..79bed88a3a62952b3f012bf864f3b9f7a3a0e820 100644
--- a/loadbj.m
+++ b/loadbj.m
@@ -493,7 +493,7 @@ function [object, pos, mmap] = parse_object(inputstr, pos, varargin)
                 [str, pos] = parse_name(inputstr, pos, varargin{:});
             end
             if isempty(str)
-                error_pos('Name of value at position %d cannot be empty', inputstr, pos);
+                str='x0x0_'; % empty name is valid in BJData/UBJSON, decodevarname('x0x0_') restores '\0'
             end
             if(nargout>2)
                 varargin{1}.jsonpath_=[origpath,'.',str];
diff --git a/loadjson.m b/loadjson.m
index 1ee4c12e778e417ca8a28687ac1bf86e17a86158..e6ace036582f96f5b5dcf63f6f98fe5b905d9ef3 100644
--- a/loadjson.m
+++ b/loadjson.m
@@ -576,8 +576,8 @@ function [object, pos, index_esc, mmap] = parse_object(inputstr, pos, esc, index
     if cc ~= '}'
         while 1
             [str, pos, index_esc] = parseStr(inputstr, pos, esc, index_esc, varargin{:});
-            if isempty(str)
-                pos=error_pos('Name of value at position %d cannot be empty',inputstr,pos);
+            if isempty(str) && ~usemap
+                str='x0x0_'; % empty name is valid in JSON, decodevarname('x0x0_') restores '\0'
             end
             [pos, w1, w2]=parse_char(inputstr, pos, ':');
             if(nargout>3)
diff --git a/savebj.m b/savebj.m
index 28f7bb34af824f6ddfdfd453dadab92d9a502ae7..8493c501a176b94a824559861643a1e3f85f65c7 100644
--- a/savebj.m
+++ b/savebj.m
@@ -477,17 +477,11 @@ if(~strcmp(Omarker{1},'{'))
 else
     om0=Omarker{1};
 end
-len=prod(dim);
-forcearray= (len>1 || (varargin{1}.singletarray==1 && level>0));
 
 if(~isempty(name)) 
-    if(forcearray)
-        txt=[N_(decodevarname(name,varargin{:}),varargin{:}) om0];
-    end
+    txt=[N_(decodevarname(name,varargin{:}),varargin{:}) om0];
 else
-    if(forcearray)
-        txt=om0;
-    end
+    txt=om0;
 end
 for i=1:dim(1)
     if(~isempty(names{i}))
@@ -495,9 +489,7 @@ for i=1:dim(1)
              level+(dim(1)>1),varargin{:})];
     end
 end
-if(forcearray)
-    txt=[txt Omarker{2}];
-end
+txt=[txt Omarker{2}];
 
 %%-------------------------------------------------------------------------
 function txt=str2ubjson(name,item,level,varargin)
diff --git a/savejson.m b/savejson.m
index 7be8352826eabc2ce5b63e9ce4b9a3034f3b7774..8a21418b9dab8f48bae65f4a7f604f37a3d5ee40 100644
--- a/savejson.m
+++ b/savejson.m
@@ -470,14 +470,12 @@ if(~strcmp(item.KeyType,'char'))
     return;
 end
 
-len=prod(dim);
-forcearray= (len>1 || (varargin{1}.singletarray==1 && level>0));
 ws=varargin{1}.whitespaces_;
 padding0=repmat(ws.tab,1,level);
 nl=ws.newline;
 
-if(isempty(item)) 
-    if(~isempty(name)) 
+if(isempty(item))
+    if(~isempty(name))
         txt={padding0, '"', decodevarname(name,varargin{1}.unpackhex),'":[]'};
     else
         txt={padding0, '[]'};
@@ -486,30 +484,25 @@ if(isempty(item))
     return;
 end
 if(~isempty(name)) 
-    if(forcearray)
-        txt={padding0, '"', decodevarname(name,varargin{1}.unpackhex),'":{', nl};
-    end
+    txt={padding0, '"', decodevarname(name,varargin{1}.unpackhex),'":{', nl};
 else
-    if(forcearray)
-        txt={padding0, '{', nl};
-    end
+    txt={padding0, '{', nl};
 end
 
 for i=1:dim(1)
-    if(~isempty(names{i}))
-	    txt{end+1}=obj2json(names{i},val{i},...
-             level+(dim(1)>1),varargin{:});
-        if(i<length(names))
-            txt{end+1}=',';
-        end
-        if(i<dim(1))
-            txt{end+1}=nl;
-        end
+    if(isempty(names{i}))
+        txt{end+1}=obj2json('x0x0_',val{i},level+(dim(1)>1),varargin{:});
+    else
+        txt{end+1}=obj2json(names{i},val{i},level+(dim(1)>1),varargin{:});
+    end
+    if(i<length(names))
+        txt{end+1}=',';
+    end
+    if(i<dim(1))
+        txt{end+1}=nl;
     end
 end
-if(forcearray)
-    txt(end+1:end+3)={nl,padding0,'}'};
-end
+txt(end+1:end+3)={nl,padding0,'}'};
 txt = sprintf('%s',txt{:});
 
 %%-------------------------------------------------------------------------
diff --git a/test/run_jsonlab_test.m b/test/run_jsonlab_test.m
index 11a9a9784f67c43fd32ede17c9106036ff6ed5f4..3d9735ea4eeee34097c1a49d33b359609f2a6d96 100644
--- a/test/run_jsonlab_test.m
+++ b/test/run_jsonlab_test.m
@@ -49,6 +49,8 @@ if(ismember('js',tests))
         test_jsonlab('string type',@savejson,string(sprintf('jdata\n\b\ashall\tprevail')),'["jdata\n\b\ashall\tprevail"]','compact',1);
         test_jsonlab('string array',@savejson,[string('jdata'),string('shall'),string('prevail')],'["jdata","shall","prevail"]','compact',1);
     end
+    test_jsonlab('empty name',@savejson,loadjson('{"":""}'),'{"":""}','compact',1);
+    test_jsonlab('empty name with map',@savejson,loadjson('{"":""}','usemap',1),'{"":""}','compact',1);
     test_jsonlab('row vector',@savejson,[1,2,3],'[1,2,3]');
     test_jsonlab('column vector',@savejson,[1;2;3],'[[1],[2],[3]]','compact',1);
     test_jsonlab('mixed array',@savejson,{'a',1,0.9},'["a",1,0.9]','compact',1);
@@ -182,6 +184,8 @@ if(ismember('bj',tests))
         test_jsonlab('string type',@savebj,string(sprintf('jdata\n\b\ashall\tprevail')),sprintf('[SU<21>jdata\n\b\ashall\tprevail]'),'debug',1);
         test_jsonlab('string array',@savebj,[string('jdata');string('shall');string('prevail')],'[[SU<5>jdataSU<5>shallSU<7>prevail]]','debug',1);
     end
+    test_jsonlab('empty name',@savebj,loadbj(['{U' 0 'U' 2 '}']),'{U<0>U<2>}','debug',1);
+    test_jsonlab('empty name with map',@savebj,loadbj(['{U' 0 'U' 2 '}'],'usemap',1),'{U<0>U<2>}','debug',1);
     test_jsonlab('row vector',@savebj,[1,2,3],'[$U#U<3><1><2><3>','debug',1);
     test_jsonlab('column vector',@savebj,[1;2;3],'[$U#[$U#U<2><3><1><1><2><3>','debug',1);
     test_jsonlab('mixed array',@savebj,{'a',1,0.9},'[CaU<1>D<0.9>]','debug',1);