diff --git a/core/lib/Drupal/Core/Database/Driver/pgsql/Schema.php b/core/lib/Drupal/Core/Database/Driver/pgsql/Schema.php
index 1e7c4b6dca..bd79902c83 100644
--- a/core/lib/Drupal/Core/Database/Driver/pgsql/Schema.php
+++ b/core/lib/Drupal/Core/Database/Driver/pgsql/Schema.php
@@ -455,7 +455,10 @@ public function getFieldTypeMap() {
       'serial:medium' => 'serial',
       'serial:big' => 'bigserial',
       'serial:normal' => 'serial',
-      ];
+
+      'json:normal' => 'json',
+      'jsonb:normal' => 'jsonb',
+    ];
     return $map;
   }
 
diff --git a/core/misc/cspell/dictionary.txt b/core/misc/cspell/dictionary.txt
index 357f8f4bfd..b8b2d0087b 100644
--- a/core/misc/cspell/dictionary.txt
+++ b/core/misc/cspell/dictionary.txt
@@ -794,6 +794,7 @@ jours
 jqueryui
 json's
 jsonapi
+jsonb
 jsonlint
 jssdk
 jumplinks
diff --git a/core/tests/Drupal/KernelTests/Core/Database/SchemaTest.php b/core/tests/Drupal/KernelTests/Core/Database/SchemaTest.php
index 8dce420471..2e1726c43b 100644
--- a/core/tests/Drupal/KernelTests/Core/Database/SchemaTest.php
+++ b/core/tests/Drupal/KernelTests/Core/Database/SchemaTest.php
@@ -275,6 +275,80 @@ public function testSchema() {
     $this->assertTrue($this->schema->tableExists('test_timestamp'), 'Table with database specific datatype was created.');
   }
 
+  /**
+   * Tests json schema types.
+   *
+   * @param string $fieldType
+   *   The Drupal field type name.
+   * @param string $insertData
+   *   A JSON string to insert into the test_field column.
+   * @param string $selectField
+   *   A select field to retrieve data.
+   * @param array $selectPlaceholder
+   *   Placeholder values for the select field above.
+   * @param mixed $expected
+   *   The expected value to assert.
+   *
+   * @dataProvider providerTestJsonSchema
+   */
+  public function testJsonSchema($fieldType, $insertData, $selectField, array $selectPlaceholder, $expected) {
+    $table_specification = [
+      'fields' => [
+        'id'  => ['type' => 'serial', 'not null' => TRUE],
+        'test_field'  => ['type' => $fieldType],
+      ],
+      'primary key' => ['id'],
+    ];
+
+    if ($this->connection->databaseType() === 'pgsql') {
+      // @todo Refactor based on policy: https://www.drupal.org/project/drupal/issues/3109340
+      try {
+        $this->schema->createTable('test_json', $table_specification);
+
+        $this->connection->insert('test_json')
+          ->values(['test_field' => $insertData])
+          ->execute();
+        $query = $this->connection->select('test_json')
+          ->addExpression($selectField, NULL, $selectPlaceholder)
+          ->range(0, 1);
+
+        $actual = $query->execute()->fetchField(0);
+        $this->assertSame($expected, $actual);
+      }
+      catch (\Exception $e) {
+      }
+      $this->assertTrue($this->schema->tableExists('test_json'), 'Table with database specific datatype was created.');
+    }
+    else {
+      $this->markTestSkipped("The database driver does not support the field type: $fieldType.");
+    }
+  }
+
+  /**
+   * Provides test arguments for json schema tests.
+   *
+   * @return \string[][]
+   *   The test arguments.
+   */
+  public function providerTestJsonSchema() {
+    return [
+      'json ' => [
+        'json',
+        '{"key": "value", "number": 0, "bool": true, "list": ["a","b","c"], "nested": {"key": "value"}}',
+        "test_field->:key",
+        [':key' => 'key'],
+        'value',
+      ],
+      'jsonb' => [
+        'jsonb',
+        '{"key": "value", "number": 0, "bool": true, "list": ["a", "b", "c"], "nested": {"key": "value"}}',
+        "test_field->:nested->:key",
+        [':nested' => ':nested', ':key' => 'key'],
+        'value',
+      ],
+    ];
+  }
+
   /**
    * @covers \Drupal\Core\Database\Driver\mysql\Schema::introspectIndexSchema
    * @covers \Drupal\Core\Database\Driver\pgsql\Schema::introspectIndexSchema
