PostgreSQL:有一种优雅的方式在深层对象层次结构中使用自定义json强制转换函数吗?

时间:2016-02-28 21:28:51

标签: 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类型的(伪)自定义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

0 个答案:

没有答案