diff --git a/src/com/android/contacts/model/ContactLoader.java b/src/com/android/contacts/model/ContactLoader.java
index 8583f14..28b1e5a 100644
--- a/src/com/android/contacts/model/ContactLoader.java
+++ b/src/com/android/contacts/model/ContactLoader.java
@@ -55,6 +55,7 @@
 import com.google.common.collect.Maps;
 import com.google.common.collect.Sets;
 
+import org.json.JSONArray;
 import org.json.JSONException;
 import org.json.JSONObject;
 
@@ -405,23 +406,18 @@
         final Iterator keys = items.keys();
         while (keys.hasNext()) {
             final String mimetype = (String) keys.next();
-            final JSONObject item = items.getJSONObject(mimetype);
 
-            final ContentValues itemValues = new ContentValues();
-            itemValues.put(Data.MIMETYPE, mimetype);
-            itemValues.put(Data._ID, -1);
-
-            final Iterator iterator = item.keys();
-            while (iterator.hasNext()) {
-                String name = (String) iterator.next();
-                final Object o = item.get(name);
-                if (o instanceof String) {
-                    itemValues.put(name, (String) o);
-                } else if (o instanceof Integer) {
-                    itemValues.put(name, (Integer) o);
+            // Could be single object or array.
+            final JSONObject obj = items.optJSONObject(mimetype);
+            if (obj == null) {
+                final JSONArray array = items.getJSONArray(mimetype);
+                for (int i = 0; i < array.length(); i++) {
+                    final JSONObject item = array.getJSONObject(i);
+                    processOneRecord(rawContact, item, mimetype);
                 }
+            } else {
+                processOneRecord(rawContact, obj, mimetype);
             }
-            rawContact.addDataItemValues(itemValues);
         }
 
         contact.setRawContacts(new ImmutableList.Builder<RawContact>()
@@ -430,6 +426,25 @@
         return contact;
     }
 
+    private void processOneRecord(RawContact rawContact, JSONObject item, String mimetype)
+            throws JSONException {
+        final ContentValues itemValues = new ContentValues();
+        itemValues.put(Data.MIMETYPE, mimetype);
+        itemValues.put(Data._ID, -1);
+
+        final Iterator iterator = item.keys();
+        while (iterator.hasNext()) {
+            String name = (String) iterator.next();
+            final Object o = item.get(name);
+            if (o instanceof String) {
+                itemValues.put(name, (String) o);
+            } else if (o instanceof Integer) {
+                itemValues.put(name, (Integer) o);
+            }
+        }
+        rawContact.addDataItemValues(itemValues);
+    }
+
     private Contact loadContactEntity(ContentResolver resolver, Uri contactUri) {
         Uri entityUri = Uri.withAppendedPath(contactUri, Contacts.Entity.CONTENT_DIRECTORY);
         Cursor cursor = resolver.query(entityUri, ContactQuery.COLUMNS, null, null,
