create or replace procedure foo (j varchar2) is
  o json_object_t;
begin
  o := json_object_t(j);
  o.put('newKey', 'newValue');
  dbms_output.put_line(o.to_string);
end;exec foo('{}')exec foo('{a:1}')exec foo('[]')create or replace procedure foo (j varchar2) is
  a json_array_t;
begin
  a := json_array_t(j);
  a.append('newValue');
  dbms_output.put_line(a.to_string);
end;exec foo('[]')create or replace procedure bar (j varchar2) is
  e json_element_t;
begin
  e := json_element_t.parse(j);
  dbms_output.put_line(e.to_string);
  if (e.is_object) then
    dbms_output.put_line('I am an object');
  elsif (e.is_array) then
    dbms_output.put_line('I am an array');
  end if;
end;exec bar('{a:1}')exec bar('[1,2,3]')exec bar('x')create or replace procedure value_info (e json_element_t) is
 o json_object_t;
 a json_array_t;
 s json_scalar_t;
begin
  if (e.is_object) then
    o := TREAT (e as json_object_t);
  elsif (e.is_array) then
    a := TREAT (e as json_array_t);
  else 
    s := TREAT (e as json_scalar_t);
 end if;
end;create or replace procedure array_info (a json_array_t) is
  e json_element_t;
begin
  for i in 0 .. (a.get_size - 1) loop
    e := a.get(i);
    dbms_output.put_line('Array position ' || i || ' has value ' || e.to_string);
  end loop;
end;create or replace procedure scalar_info (s json_scalar_t) is
  e json_element_t;
begin
  if (s.is_number) then
     dbms_output.put_line('Scalar of type number with value ' || s.to_number);
  elsif (s.is_string) then
     dbms_output.put_line('Scalar of type string with value ' || s.to_string);
  elsif (s.is_boolean) then
     dbms_output.put_line('Scalar of type boolean with value ' || s.to_string);
  end if;
end;create or replace procedure object_info (o json_object_t) is
  e json_element_t;
  keys json_key_list;
  key  varchar2(256);
begin
  keys := o.get_keys;
  for i in 1 .. keys.count loop
    key := keys(i);
    e := o.get(key);
    dbms_output.put_line('key ' || key || ' has value ' || e.to_string);
  end loop;
end;create or replace procedure json_info (j varchar2) is
 e json_element_t;
begin
  e := JSON_ELEMENT_T.parse(j);
  if (e.is_object) then
    object_info(TREAT (e as json_object_t));
  elsif (e.is_array) then
    array_info(TREAT (e as json_array_t));
  else 
    scalar_info(TREAT (e as json_scalar_t));
 end if;
end;exec json_info('[1,2,{a:1}, true]')exec json_info('{a:1, b:false}')declare 
  o json_object_t;
  a json_array_t;
  b boolean;
begin
  o := new json_object_t;
  a := new json_array_t;
  
  o.put('key', 'value1');
  o.put('key', 'value2');
  dbms_output.put_line(o.to_string);
  
  a.append(true);
  a.append('true');
  a.append(123);
  a.put(2, 456);
  dbms_output.put_line(a.to_string);
  
  a.append(o);
  dbms_output.put_line(a.to_string);
  
  o.put('nestedArr', a);
  dbms_output.put_line(o.to_string);
end;declare
  o json_object_t;
  d date;
  e json_element_t;
begin
  o := new json_object_t;
  o.put('date', SYSDATE);
  dbms_output.put_line(o.to_string);
  d := o.get_date('date');
  dbms_output.put_line(d);
  
  o.put('date_as_string', '2019-07-09T15:18:41');
  e := o.get('date_as_string');
  dbms_output.put_line('ts:' || e.to_timestamp);
  
  o.put('date_as_string', '2019-07-09T15:18:41_XXXX');
  e := o.get('date_as_string');
  dbms_output.put_line('ts:' || e.to_timestamp);
end;declare
  o json_object_t;
  d date;
  e json_element_t;
begin
  o := new json_object_t;
  o.put('date_as_string', '2019-07-09T15:18:41_XXXX');
  e := o.get('date_as_string');
  e.on_error(1);
  dbms_output.put_line('ts:' || e.to_timestamp);
end;declare
  customer json_object_t;
  address  json_object_t;
begin
  customer := json_object_t('{name:"Tom", address:{city:"Paris"}}');
  address  := customer.get_object('address');
 
  dbms_output.put_line(address.to_string);
  dbms_output.put_line(customer.to_string);
 
  address.put('city', 'Marseille');
  dbms_output.put_line(address.to_string);
  dbms_output.put_line(customer.to_string);
end;declare
  customer json_object_t;
  address  json_object_t;
begin
  customer := json_object_t('{name:"Tom", address:{city:"Paris"}}');
  address  := customer.get_object('address').clone;
 
  dbms_output.put_line(address.to_string);
  dbms_output.put_line(customer.to_string);
 
  address.put('city', 'Marseille');
  dbms_output.put_line(address.to_string);
  dbms_output.put_line(customer.to_string);
end;declare
  customer json_object_t;
  address  json_object_t;
begin
  customer := json_object_t('{name:"Tom"}');
  address  := json_object_t('{city:"Paris"}');
 
  customer.put('address', address);
  dbms_output.put_line(customer.to_string);
 
  address.put('city', 'Marseille');
  dbms_output.put_line(address.to_string);
  dbms_output.put_line(customer.to_string);
end;create table t (col json_object_t)select 'comments' from dual;