PostgreSQL:有没有一种优雅的方法可以在深层对象层次结构中使用自定义json强制转换函数?
在PostgreSQL 9.5中将对象转换为json时,是否有任何方法可以确保在对象图的任意级别为包含的对象调用自定义json转换函数 例如: 自定义类型:PostgreSQL:有没有一种优雅的方法可以在深层对象层次结构中使用自定义json强制转换函数?,json,postgresql,casting,Json,Postgresql,Casting,在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
CREATE TYPE Page AS (pageNum INTEGER);
CREATE TYPE Chapter AS (chapterTitle text, pages Page[]);
CREATE TYPE Book AS (title TEXT, chapters Chapter[]);
用于页面
类型的(伪)自定义json
cast函数:
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 cast函数
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函数,以确保为页面类型的实例调用自定义json转换函数。但是,有没有一种优雅的方法可以确保这一点,即不需要在对象图的每一级都使用自定义json转换函数
编辑:查看PostgreSQL源代码(9.5版)似乎没有留下太多希望,即to_json
-函数可以被某种方式欺骗,使用定义的自定义json转换函数。(C函数composite_to_json
似乎就是转换发生的地方)
您是否尝试过使用
CREATE CAST
命令的?只是尝试了一下,似乎没有帮助。我认为答案在(我的重点):“数组和组合被(递归地)转换为数组和对象;否则,如果存在从类型到json的转换,则将使用转换函数来执行转换”。换句话说,它没有明确提到数组和复合/行类型的强制转换。