在PostgreSQL 9.5中将对象转换为json时,有没有办法确保为对象图中任意级别的包含对象调用自定义json强制转换函数?
一个例子:
自定义类型:
CREATE TYPE Page AS (pageNum INTEGER);
CREATE TYPE Chapter AS (chapterTitle text, pages Page[]);
CREATE TYPE Book AS (title TEXT, chapters Chapter[]);
json
类型的(伪)自定义Page
强制转换功能:
CREATE OR REPLACE FUNCTION cast_page_to_json(Page) RETURNS json AS $$
DECLARE
result json;
BEGIN
SELECT row_to_json(a.*) INTO result
FROM (
SELECT $1.pageNum AS num, 'test' AS debug
) AS a;
RETURN result;
END;
$$ LANGUAGE plpgsql IMMUTABLE;
—DROP CAST (Page AS json);
CREATE CAST (Page AS json) WITH FUNCTION cast_page_to_json(Page);
现在,在运行下面的查询时,不会调用自定义json强制转换函数。
SELECT to_json(
ROW(
'My First Book',
ARRAY[
ROW(
'Chapter 1'
,
ARRAY[
ROW(1)::Page,
ROW(2)::Page
]
::Page[]
)::Chapter
]
)::Book) ;
输出:
{
"title": "My First Book",
"chapters": [
{
"chaptertitle": "Chapter 1",
"pages": [
{
"pagenum": 1
},
{
"pagenum": 2
}
]
}
]
}
我知道我可以为对象图中的每个级别编写自定义json强制转换函数,然后在顶层调用自定义json函数 - 以确保为Page类型的实例调用自定义json强制转换函数。但有没有一种优雅的方法来确保这一点,在对象图中的每个级别都不需要自定义json强制转换函数?
编辑:在PostgreSQL源代码(版本9.5)中偷看似乎并没有留下太多希望,to_json
- 函数可能以某种方式被欺骗使用定义的自定义json强制转换函数。 (C函数composite_to_json
似乎是转换发生的地方)
composite_to_json