Validating JSON in the database
Creating REST services and consuming JSON inside the Oracle database has become quite easy. The APEX_JSON package provides a number of useful procedures and functions to work with JSON. However, one thing I haven’t found is a way to validate JSON before parsing it.
To my knowledge, there is not yet a PL/SQL way to check whether a JSON string is valid, i.e. to make sure that all the brackets, commas, colons, etc. are there. There is, however, a column check constraint you can use in 12c that will only allow valid JSON to be inserted into a table. So here is a quick workaround for validating JSON using the check constraint: I simply take the JSON and attempt to insert it into the table. If the check constraint is violated, I’ll get an error.
I wrapped the whole thing in a function that will then simply return a boolean value for the JSON passed into it.
create table json_validator (
id number generated always as identity primary key
,json clob
,constraint validate_json check (json is json format json)
);
create or replace function validate_json (l_json in clob)
return boolean
is
l_id pls_integer;
e_invalid_json exception;
pragma exception_init (e_invalid_json,-2290);
pragma autonomous_transaction;
begin
insert into json_validator (json) values (l_json);
rollback;
return true;
exception
when e_invalid_json then
return false;
end;
/
set serveroutput on
declare
l_json clob;
l_return boolean;
begin
l_json := '
{"widget": {
"debug": "on",
"window": {
"title": "sample konfabulator widget",
"name": "main_window",
"width": 500,
"height": 500
},
"image": {
"src": "images/sun.png",
"name": "sun1",
"hoffset": 250,
"voffset": 250,
"alignment": "center"
},
"text": {
"data": "click here",
"size": 36,
"style": "bold",
"name": "text1",
"hoffset": 250,
"voffset": 100,
"alignment": "center",
"onmouseup": "sun1.opacity = (sun1.opacity / 100) * 90;"
}
}}
';
l_return := validate_json(l_json => l_json );
if l_return then
dbms_output.put_line('JSON is valid');
else
dbms_output.put_line('JSON is NOT valid');
end if;
end;
/
Couple ideas; You could APEX_JSON.PARSE
Or inline sub select the JSON to avoid the validator table
will this code works in11g 4 db??
I think you have to have 12.1 or higher.