diff --git a/src/backend/utils/adt/json.c b/src/backend/utils/adt/json.c
index 28e5f3c..b58b7ce 100644
--- a/src/backend/utils/adt/json.c
+++ b/src/backend/utils/adt/json.c
@@ -1220,6 +1220,12 @@ json_build_object_worker(int nargs, const Datum *args, const bool *nulls, const
 		bool		skip;
 		int			key_offset;
 
+		/* Keys must not be null, even if their values are skipped. */
+		if (nulls[i])
+			ereport(ERROR,
+					(errcode(ERRCODE_NULL_VALUE_NOT_ALLOWED),
+					 errmsg("null value not allowed for object key")));
+
 		/* Skip null values if absent_on_null */
 		skip = absent_on_null && nulls[i + 1];
 
@@ -1239,11 +1245,6 @@ json_build_object_worker(int nargs, const Datum *args, const bool *nulls, const
 		}
 
 		/* process key */
-		if (nulls[i])
-			ereport(ERROR,
-					(errcode(ERRCODE_NULL_VALUE_NOT_ALLOWED),
-					 errmsg("null value not allowed for object key")));
-
 		/* save key offset before appending it */
 		key_offset = out->len;
 
diff --git a/src/test/regress/expected/sqljson.out b/src/test/regress/expected/sqljson.out
index 30f9e10..0881e18 100644
--- a/src/test/regress/expected/sqljson.out
+++ b/src/test/regress/expected/sqljson.out
@@ -397,6 +397,15 @@ LINE 1: SELECT JSON_OBJECT('foo': NULL::jsonb FORMAT JSON ENCODING U...
                                               ^
 SELECT JSON_OBJECT(NULL: 1);
 ERROR:  null value not allowed for object key
+-- NULL keys are invalid even if their values would be omitted.
+SELECT JSON_OBJECT(NULL: NULL ABSENT ON NULL);
+ERROR:  null value not allowed for object key
+SELECT JSON_OBJECT(NULL: NULL ABSENT ON NULL RETURNING jsonb);
+ERROR:  argument 1: key must not be null
+SELECT JSON_OBJECT(NULL: NULL ABSENT ON NULL WITH UNIQUE KEYS);
+ERROR:  null value not allowed for object key
+SELECT JSON_OBJECT(NULL: NULL ABSENT ON NULL WITH UNIQUE KEYS RETURNING jsonb);
+ERROR:  argument 1: key must not be null
 SELECT JSON_OBJECT('a': 2 + 3);
  json_object 
 -------------
diff --git a/src/test/regress/sql/sqljson.sql b/src/test/regress/sql/sqljson.sql
index 9fa203c..6dc52ed 100644
--- a/src/test/regress/sql/sqljson.sql
+++ b/src/test/regress/sql/sqljson.sql
@@ -86,6 +86,11 @@ SELECT JSON_OBJECT('foo': NULL::jsonb FORMAT JSON);
 SELECT JSON_OBJECT('foo': NULL::jsonb FORMAT JSON ENCODING UTF8);
 
 SELECT JSON_OBJECT(NULL: 1);
+-- NULL keys are invalid even if their values would be omitted.
+SELECT JSON_OBJECT(NULL: NULL ABSENT ON NULL);
+SELECT JSON_OBJECT(NULL: NULL ABSENT ON NULL RETURNING jsonb);
+SELECT JSON_OBJECT(NULL: NULL ABSENT ON NULL WITH UNIQUE KEYS);
+SELECT JSON_OBJECT(NULL: NULL ABSENT ON NULL WITH UNIQUE KEYS RETURNING jsonb);
 SELECT JSON_OBJECT('a': 2 + 3);
 SELECT JSON_OBJECT('a' VALUE 2 + 3);
 --SELECT JSON_OBJECT(KEY 'a' VALUE 2 + 3);
