To kolejny dobry przykład, dlaczego wybór odpowiedniego typu danych od samego początku pomaga później;)
Nie ma wbudowanej funkcji sprawdzającej, czy dany tekst jest poprawnym JSON. Możesz jednak napisać własny:
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;
Uwaga:ze względu na obsługę wyjątków nie będzie to szybkie. Jeśli nazwiesz to wieloma nieprawidłowymi wartościami, znacznie spowolni to twój wybór.
Jednak oba '{"products": 1}'
i '{"products": [1,2,3]}'
są poprawnymi dokumentami JSON. Fakt, że pierwsza jest nieprawidłowa, wynika z logiki aplikacji, a nie ze składni JSON.
Aby sprawdzić, czy potrzebujesz podobnej funkcji, która wyłapuje błędy podczas wywoływania 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;