Index: django/db/models/fields/__init__.py
===================================================================
--- django/db/models/fields/__init__.py	(revision 12617)
+++ django/db/models/fields/__init__.py	(working copy)
@@ -8,6 +8,7 @@
 from django.db import connection
 from django.db.models.fields.subclassing import LegacyConnection
 from django.db.models.query_utils import QueryWrapper
+from django.db.models import signals
 from django.conf import settings
 from django import forms
 from django.core import exceptions, validators
@@ -18,7 +19,9 @@
 from django.utils.translation import ugettext_lazy as _
 from django.utils.encoding import smart_unicode, force_unicode, smart_str
 from django.utils import datetime_safe
+from django.utils import simplejson as json
 
+
 class NOT_PROVIDED:
     pass
 
@@ -1129,3 +1132,52 @@
         self.schema_path = schema_path
         Field.__init__(self, verbose_name, name, **kwargs)
 
+
+class JSONDateEncoder(json.JSONEncoder):
+    def default(self, obj):
+        if isinstance(obj, datetime):
+            return obj.strftime('%Y-%m-%d %H:%M:%S')
+        elif isinstance(obj, datetime.date):
+            return obj.strftime('%Y-%m-%d')
+        elif isinstance(obj, datetime.time):
+            return obj.strftime('%H:%M:%S')
+        return json.JSONEncoder.default(self, obj)
+
+
+class JSONField(TextField):
+    description = _("Data that serializes and deserializes into and out of JSON.")
+
+    def _dumps(self, data):
+        return JSONDateEncoder().encode(data)
+
+    def _loads(self, str):
+        return json.loads(str, encoding=settings.DEFAULT_CHARSET)
+
+    def db_type(self):
+        return 'text'
+
+    def pre_save(self, model_instance, add):
+        value = getattr(model_instance, self.attname, None)
+        return self._dumps(value)
+
+    def contribute_to_class(self, cls, name):
+        self.class_name = cls
+        super(JSONField, self).contribute_to_class(cls, name)
+        signals.post_init.connect(self.post_init)
+
+        def get_json(model_instance):
+            return self._dumps(getattr(model_instance, self.attname, None))
+        setattr(cls, 'get_%s_json' % self.name, get_json)
+
+        def set_json(model_instance, json):
+            return setattr(model_instance, self.attname, self._loads(json))
+        setattr(cls, 'set_%s_json' % self.name, set_json)
+
+    def post_init(self, **kwargs):
+        if 'sender' in kwargs and 'instance' in kwargs:
+            if kwargs['sender'] == self.class_name and hasattr(kwargs['instance'], self.attname):
+                value = self.value_from_object(kwargs['instance'])
+                if (value):
+                    setattr(kwargs['instance'], self.attname, self._loads(value))
+                else:
+                    setattr(kwargs['instance'], self.attname, None)
Index: tests/modeltests/field_subclassing/models.py
===================================================================
--- tests/modeltests/field_subclassing/models.py	(revision 12617)
+++ tests/modeltests/field_subclassing/models.py	(working copy)
@@ -19,6 +19,10 @@
 class DataModel(models.Model):
     data = JSONField()
 
+class ArbitraryDataModel(models.Model):
+    data = models.JSONField()
+
+
 __test__ = {'API_TESTS': ur"""
 # Creating a model with custom fields is done as per normal.
 >>> s = Small(1, 2)
@@ -70,4 +74,12 @@
 >>> for m in MyModel.objects.all(): print unicode(m.data)
 12
 23
+
+# Test the Real JSONField
+>>> a1 = ArbitraryDataModel()
+>>> a1.data = [{'name': 'PyCon', 'type': 'Conference'}, {'name': 'BarCamp', 'type': 'Unconference'}]
+>>> a1.save()
+>>> a2 = ArbitraryDataModel.objects.get(id=a1.id)
+>>> print a2.data[1]['name']
+BarCamp
 """}
Index: AUTHORS
===================================================================
--- AUTHORS	(revision 12617)
+++ AUTHORS	(working copy)
@@ -35,6 +35,7 @@
     Ahmad Alhashemi <trans@ahmadh.com>
     Ahmad Al-Ibrahim
     Antoni Aloy
+    Patrick Altman <paltman@gmail.com>
     Daniel Alves Barbosa de Oliveira Vaz <danielvaz@gmail.com>
     AgarFu <heaven@croasanaso.sytes.net>
     Dagur Páll Ammendrup <dagurp@gmail.com>
Index: docs/ref/models/fields.txt
===================================================================
--- docs/ref/models/fields.txt	(revision 12617)
+++ docs/ref/models/fields.txt	(working copy)
@@ -791,6 +791,20 @@
 
 .. _RelaxNG: http://www.relaxng.org/
 
+``JSONField``
+-------------
+
+.. class:: JSONField([**options])
+
+.. versionadded:: 1.2
+
+A :class:`TextField` that stores serialized data in the form of JSON.  You can
+set this field to be any Python data structure that contains data that can be
+serialized by the ``simplejson`` serializer, in addition to DateTime objects,
+which can be serialized even though upon deserialization they will remain
+strings.
+
+
 Relationship fields
 ===================
 
