jsonb_each() and json_each()

Purpose: Create a row set with columns "key" (as a SQL text) and "value" (as a SQL jsonb) from a JSON object.

Signature For the jsonb variant:

input value:       jsonb
return value:      SETOF (text, jsonb)

Use this ysqlsh script to create the required type "t" and then to execute the ASSERT.

create type t as (k text, v jsonb);

do $body$
declare
  object constant jsonb :=
    '{"a": 17, "b": "dog", "c": true, "d": {"a": 17, "b": "cat"}}';

  k_v_pairs t[] := null;
  expected_k_v_pairs constant t[] :=
    array[
      ('a', '17'::jsonb),
      ('b', '"dog"'::jsonb),
      ('c', 'true'::jsonb),
      ('d', '{"a": 17, "b": "cat"}'::jsonb)
    ];

  k_v_pair t;
  n int := 0;
begin
  for k_v_pair in (
    select key, value from jsonb_each(object)
    )
  loop
    n := n + 1;
    k_v_pairs[n] := k_v_pair;
  end loop;

  assert
    k_v_pairs = expected_k_v_pairs,
  'unexpected';
end;
$body$;