Това е още един добър пример защо избирането на подходящия тип данни от самото начало помага по-късно;)
Няма вградена функция за проверка дали даден текст е валиден JSON. Можете обаче да напишете свой собствен:
create or replace function is_valid_json(p_json text)
returns boolean
as
$$
begin
return (p_json::json is not null);
exception
when others then
return false;
end;
$$
language plpgsql
immutable;
Внимание:поради обработката на изключения това няма да бъде бързо. Ако извикате това на много невалидни стойности, това ще забави значително вашия избор.
Въпреки това и двата '{"products": 1}'
и '{"products": [1,2,3]}'
са валидни JSON документи. Фактът, че първото е невалидно, се основава на логиката на вашето приложение, а не на JSON синтаксиса.
За да проверите дали ще ви трябва подобна функция, която прихваща грешки при извикване на json_array_length()
create or replace function is_valid_json_array(p_json text, p_element text)
returns boolean
as
$$
begin
return json_array_length( p_json::json -> p_element) >= 0;
exception
when others then
return false;
end;
$$
language plpgsql
immutable;