diff --git a/synapse/storage/__init__.py b/synapse/storage/__init__.py
index d38d6134504fb2544f42a096e34be592d2c3c1f3..cd9acdc447e9cd86715aaad6235c32f1234fcf7b 100644
--- a/synapse/storage/__init__.py
+++ b/synapse/storage/__init__.py
@@ -81,11 +81,11 @@ class DataStore(RoomDataStore, RoomMemberStore, MessageStore, RoomStore,
             "event_type", event.type,
             "sender": event.user_id,
             "room_id": event.room_id,
-            "content": event.content,
+            "content": json.dumps(event.content),
         }
 
         unrec = {k: v for k, v in event.get_full_dict() if k not in vals.keys()}
-        val["unrecognized_keys"] = unrec
+        val["unrecognized_keys"] = json.dumps(unrec)
 
         yield self._simple_insert("events", vals)
 
diff --git a/synapse/storage/_base.py b/synapse/storage/_base.py
index 489b6bd171fec7fb39c537684c2aafc2ca06171a..5cb26ad6dba1b37c6b1b48bd7bcac9d4349944d2 100644
--- a/synapse/storage/_base.py
+++ b/synapse/storage/_base.py
@@ -288,7 +288,8 @@ class SQLBaseStore(object):
 
     def _parse_event_from_row(self, row_dict):
         d = copy.deepcopy({k: v for k, v in row.items() if v})
-        d.update(json.loads(row["unrecognized_keys"]))
+        d.update(json.loads(json.loads(row["unrecognized_keys"])))
+        d["content"] = json.loads(d["content"})
         del d["unrecognized_keys"]
 
         return self.event_factory.create_event(