+def _deserialize_object(s):
+ if not s.startswith('{'):
+ return False, None, None
+
+ instance = []
+
+ s = s[1:].lstrip()
+
+ # TODO Handle empty objects
+
+ succeeded, key, s = _deserialize_one(s)
+
+ assert succeeded
+ assert key.tag in [tags.UTF8, tags.UTF16, tags.UTF32]
+
+ s = s.lstrip()
+ assert s.startswith(':')
+
+ s = s[1:].lstrip()
+
+ succeeded, value, s = _deserialize_one(s)
+
+ assert succeeded
+ instance.append((key, value))
+
+ s = s.lstrip()
+
+ while s.startswith(','):
+ succeeded, key, s = _deserialize_one(s)
+
+ assert succeeded
+ assert key.tag in [tags.UTF8, tags.UTF16, tags.UTF32]
+
+ s = s.lstrip()
+ assert s.startswith(':')
+
+ s = s[1:].lstrip()
+
+ succeeded, value, s = _deserialize_one(s)
+
+ assert succeeded
+ instance.append((key, value))
+
+ s = s.lstrip()
+
+ assert s.startswith('}')
+ return True, tags.TaggedObject(tag = tags.LIST, instance = instance), s[1:]
+