Purpose: Create a JSON object from a SQL record.

Signature:

input value:       record
pretty:            boolean (optional)
return value:      json

Notes: This has only the json variant. The first (mandatory) formal parameter is any SQL record whose fields might be compound values. The second formal parameter is optional. When it is true, line feeds are added between fields. Use this ysqlsh script to create the required type "t" and then to execute the ASSERT.

create type t as (a int, b text);

do $body$
declare
  row constant t := (42, 'dog');
  j_false constant json := row_to_json(row, false);
  j_true  constant json := row_to_json(row, true);
  expected_j_false constant json := '{"a":42,"b":"dog"}';
  expected_j_true  constant json :=
'{"a":42,
 "b":"dog"}';
begin
  assert
    (j_false::text = expected_j_false::text) and
    (j_true::text  = expected_j_true::text),
  'unexpected';
end;
$body$;

The row_to_json() function has no practical advantage over to_json() or to_jsonb() and is restricted because it explicitly handles a SQL record and cannot handle a SQL array (at top level). If you want to pretty-print the text representation of the JSON value result, you can use the ::text typecast or jsonb_pretty().