diff --git a/djblets/webapi/core.py b/djblets/webapi/core.py
index 319bda1774aec280ef90fc5b36f8baa0965a172b..d6770ef4ce64c13b0427caf5bdf3414d1471f4e5 100644
--- a/djblets/webapi/core.py
+++ b/djblets/webapi/core.py
@@ -93,7 +93,10 @@ class JSONEncoderAdapter(simplejson.JSONEncoder):
 
         If the encoder is unable to encode this object, a TypeError is raised.
         """
-        result = self.encoder.encode(o, *self.encode_args, **self.encode_kwargs)
+        if isinstance(o, NameArray):
+            result = o.Array
+        else:
+            result = self.encoder.encode(o, *self.encode_args, **self.encode_kwargs)
 
         if result is None:
             raise TypeError("%r is not JSON serializable" % (o,))
@@ -158,6 +161,18 @@ class XMLEncoderAdapter(object):
                 self.text("False")
         elif o is None:
             pass
+        elif isinstance(o, NameArray):
+            if o.ArrayName is not None:
+                self.startElement(o.ArrayName)
+            for i in o.Array:
+                if o.ItemName is not None:
+                    self.startElement(o.ItemName)
+                if i:
+                    self.__encode(i, *args, **kwargs)
+                if o.ItemName is not None:
+                    self.endElement(o.ItemName)
+            if o.ArrayName is not None:
+                self.endElement(o.ArrayName)
         else:
             result = self.encoder.encode(o, *args, **kwargs)
 
@@ -420,6 +435,15 @@ def get_registered_encoders():
     return __registered_encoders
 
 
+class NameArray():
+    ArrayName = ""
+    ItemName = ""
+    Array = []
+    def __init__(self, ArrayName, ItemName, Array, *args, **kwargs):
+        self.ArrayName = ArrayName
+        self.ItemName = ItemName
+        self.Array = Array
+
 # Backwards-compatibility
 #
 # This must be done after the classes in order to avoid a
