2021-08-11
SELECT jsonb_build_object('a', 1234);
-- output: { "a": 123 }
There are two variants of this function that do the same thing but the return object type is different. json_build_object returns json and jsonb_build_object return jsonb (about the json and jsonb types in PostgreSQL). I tend to use jsonb exclusively, so all examples moving forward will use the jsonb variant.
jsonb_build_object takes a comma separated list of arguments and generates a jsonb object. The general pattern here is the arguments come in pairs. The first argument is the key and the next argument is the value. A few examples:
SELECT jsonb_build_object('a', 1234);
-- output: { "a": 123 }
SELECT jsonb_build_object('a', 1234, 'name', 'alex');
-- output: { "a": 123, "name": 'alex' }
Or more complex examples:
SELECT jsonb_build_object(
'name', 'alex',
'phone_numbers', ARRAY['111-111-1111', '222-222-2222']
);
-- output:
-- {
-- "name": "alex",
-- "phone_numbers": ["111-111-1111", "222-222-2222"]
-- }
SELECT jsonb_build_object(
'name', 'alex',
'phone_numbers', jsonb_build_object(
'home', '111-111-1111',
'cell', '222-222-2222'
)
);
-- output:
-- {
-- "name": "alex",
-- "phone_numbers": {
-- "home": "111-111-1111",
-- "cell": "222-222-2222"
-- }
-- }
A cool feature of jsonb and the functions that work with jsonb is automatic conversion to jsonb. We've already seen an example of this above with the ARRAY data type. For example, the PostGIS extension includes a method to convert geometries to GeoJSON. The follow takes advantage of that built in conversion:
SELECT jsonb_build_object('coords', ST_GeomFromText('POINT(-71.064544 42.28787)'));
-- output:
-- {
-- "coords": {
-- "type": "Point",
-- "coordinates": [-71.064544, 42.28787]
-- }
-- }
mitchell@gritts.me
Built by me. Writing and images are my original work unless otherwise noted. Please attribute this site when sharing.
This content served from this URL (mitchell.gritts.net) is licensed with the Unlicense. Content served from other URLs may have other licenses. The repo is currently private while I actively build out the site.