如何在Postgresql中验证JSON是否有效?

时间:2015-05-12 10:01:41

标签: json postgresql

我有一个大型数据库,其中包含用JSON编写的分析数据。

我想过滤掉数据不正确的行:

  • 无效的json(某些行有类似的内容:'{"hello": "world'
  • 某些属性不是数组,因此需要'{"products": [1,2,3]}'并且会遗漏'{"products": 1}'

我想做那样的事情:

select * 
from analytics 
where (is_correct_json(json::json)) 
and (is_array(json::json->>'products'))

我怎样才能做到这一点?

1 个答案:

答案 0 :(得分:13)

这是另一个很好的例子,为什么从一开始就选择适当的数据类型有助于以后;)

没有内置函数来检查给定文本是否是有效的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;