diff --git a/django/contrib/postgres/apps.py b/django/contrib/postgres/apps.py
index f298814f7d..2ad6aaefc8 100644
--- a/django/contrib/postgres/apps.py
+++ b/django/contrib/postgres/apps.py
@@ -15,8 +15,12 @@ class PostgresConfig(AppConfig):
     def ready(self):
         # Connections may already exist before we are called.
         for conn in connections.all():
-            if conn.connection is not None:
-                register_type_handlers(conn)
+            if conn.vendor == 'postgresql':
+                conn.introspection.data_types_reverse.update({
+                    3802: 'django.contrib.postgresql.fields.JSONField',
+                })
+                if conn.connection is not None:
+                    register_type_handlers(conn)
         connection_created.connect(register_type_handlers)
         CharField.register_lookup(Unaccent)
         TextField.register_lookup(Unaccent)
diff --git a/docs/ref/django-admin.txt b/docs/ref/django-admin.txt
index 3a83bd2b7d..7c8ac29473 100644
--- a/docs/ref/django-admin.txt
+++ b/docs/ref/django-admin.txt
@@ -366,7 +366,9 @@ output:
 * If ``inspectdb`` cannot map a column's type to a model field type, it'll
   use ``TextField`` and will insert the Python comment
   ``'This field type is a guess.'`` next to the field in the generated
-  model.
+  model. The recognized fields may depend on apps listed in
+  :setting:`INSTALLED_APPS`. For example, :mod:`django.contrib.postgres` adds
+  recognition for several PostgreSQL-specific field types.
 
 * If the database column name is a Python reserved word (such as
   ``'pass'``, ``'class'`` or ``'for'``), ``inspectdb`` will append
diff --git a/docs/releases/2.0.txt b/docs/releases/2.0.txt
index 7b2df87fcf..46ff112dba 100644
--- a/docs/releases/2.0.txt
+++ b/docs/releases/2.0.txt
@@ -123,6 +123,9 @@ Minor features
   operation installs the ``btree_gist`` extension to add support for operator
   classes that aren't built-in.
 
+* :djadmin:`inspectdb` can now introspect ``JSONField``
+  (``django.contrib.postgres`` must be in ``INSTALLED_APPS``).
+
 :mod:`django.contrib.redirects`
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
diff --git a/tests/postgres_tests/test_introspection.py b/tests/postgres_tests/test_introspection.py
new file mode 100644
index 0000000000..1058a1656b
--- /dev/null
+++ b/tests/postgres_tests/test_introspection.py
@@ -0,0 +1,26 @@
+from io import StringIO
+
+from django.core.management import call_command
+from django.test.utils import modify_settings
+
+from . import PostgreSQLTestCase
+
+
+@modify_settings(INSTALLED_APPS={'append': 'django.contrib.postgres'})
+class InspectDBTests(PostgreSQLTestCase):
+    def assertFieldsInModel(self, model, field_outputs):
+        out = StringIO()
+        call_command(
+            'inspectdb',
+            table_name_filter=lambda tn: tn.startswith(model),
+            stdout=out,
+        )
+        output = out.getvalue()
+        for field_output in field_outputs:
+            self.assertIn(field_output, output)
+
+    def test_json_field(self):
+        self.assertFieldsInModel(
+            'postgres_tests_jsonmodel',
+            ['field = django.contrib.postgresql.fields.JSONField(blank=True, null=True)'],
+        )