+def _deserialize_list(s):
+ s = s.lstrip()
+
+ if not s.startswith('['):
+ return False, None, None
+
+ instance = []
+
+ s = s[1:].lstrip()
+
+ succeeded, result, s = _deserialize_one(s)
+
+ # TODO Handle empty lists
+
+ if succeeded:
+ instance.append(result)
+
+ s = s.lstrip()
+
+ while not s.startswith(']'):
+ assert s.startswith(',')
+ s = s[1:].lstrip()
+
+ succeeded, result, s = _deserialize_one(s)
+
+ # TODO Handle trailing commas
+ assert succeeded
+ instance.append(result)
+ s = s.lstrip()
+
+ assert s.startswith(']')
+ return True, tags.TaggedObject(tag = tags.LIST, instance = instance), s[1:]
+