diff --git a/loadubjson.m b/loadubjson.m
index eeec2088faeb0f837cb79279e35fa3ebd9804d8d..10ee2b4056d707e037e36efe1fe7c4fbed25a486 100644
--- a/loadubjson.m
+++ b/loadubjson.m
@@ -168,7 +168,18 @@ end
 function object = parse_object(varargin)
     parse_char('{');
     object = [];
+    type='';
+    count=-1;
+    if(next_char == '$')
+        type=inStr(pos+1); % TODO
+        pos=pos+2;
+    end
+    if(next_char == '#')
+        pos=pos+1;
+        count=double(parse_number());
+    end
     if next_char ~= '}'
+        num=0;
         while 1
             str = parseStr(varargin{:});
             if isempty(str)
@@ -176,14 +187,17 @@ function object = parse_object(varargin)
             end
             %parse_char(':');
             val = parse_value(varargin{:});
+            num=num+1;
             eval( sprintf( 'object.%s  = val;', valid_field(str) ) );
-            if next_char == '}'
+            if next_char == '}' || (count>=0 && num>=count)
                 break;
             end
             %parse_char(',');
         end
     end
-    parse_char('}');
+    if(count==-1)
+        parse_char('}');
+    end
 
 %%-------------------------------------------------------------------------
 function [cid,len]=elem_info(type)
@@ -250,7 +264,6 @@ global pos inStr isoct
             return;
         end
     end
-    
     if next_char ~= ']'
          while 1
             val = parse_value(varargin{:});
@@ -313,7 +326,7 @@ function str = parseStr(varargin)
     global pos inStr esc index_esc len_esc
  % len, ns = length(inStr), keyboard
     type=inStr(pos);
-    if type ~= 'S' && type ~= 'C'
+    if type ~= 'S' && type ~= 'C' && type ~= 'H'
         error_pos('String starting with S expected at position %d');
     else
         pos = pos + 1;
@@ -355,7 +368,7 @@ function val = parse_value(varargin)
     true = 1; false = 0;
 
     switch(inStr(pos))
-        case {'S','C'}
+        case {'S','C','H'}
             val = parseStr(varargin{:});
             return;
         case '['