Search code examples
sqljsonpostgresqljsonb

postgres: ensure json column root is an object


I'm wondering how to ensure that the data inserted into a json or jsonb column is an object, not an array (or an array of objects).

Example:

-- ok
insert into users (settings) values ('{ "theme": "cobalt" }')

-- ok
insert into users (settings) values ('{}')

-- error!
insert into users (settings) values ('[]')

-- error!
insert into users (settings) values ('[{}]') 

Thanks!


Solution

  • you could do smth like:

    t=# create table so16(j jsonb check (left(ltrim(j::text), 1) <> '['));
    CREATE TABLE
    t=# insert into so16 values('{"b":[1,2,3]}');
    INSERT 0 1
    t=# insert into so16 values('[1,2,3]');
    ERROR:  new row for relation "so16" violates check constraint "so16_j_check"
    DETAIL:  Failing row contains ([1, 2, 3]).
    t=# insert into so16 values('   [1,2,3]');
    ERROR:  new row for relation "so16" violates check constraint "so16_j_check"
    DETAIL:  Failing row contains ([1, 2, 3]).