Json 将数组类型表示形式更改为使用方括号?可能的

Json 将数组类型表示形式更改为使用方括号?可能的,json,postgresql,Json,Postgresql,这里我的问题的答案是:让我将数据库中的行转换为它们的hstore等价物。这很聪明,但会导致数组列类型的序列化/反序列化问题 我有几个数组类型的列,例如: select hstore_to_json(hstore(documents.*)) from documents where id=283; 给我(缩写形式): 我真正想要的是 "tags": ["potato", "rutabaga"], "reply_parents": [7] 因为这是格式良好的JSON。从技术上讲,第一个响应也是格

这里我的问题的答案是:让我将数据库中的行转换为它们的hstore等价物。这很聪明,但会导致数组列类型的序列化/反序列化问题

我有几个数组类型的列,例如:

select hstore_to_json(hstore(documents.*)) from documents where id=283;
给我(缩写形式):

我真正想要的是

"tags": ["potato", "rutabaga"], "reply_parents": [7]
因为这是格式良好的JSON。从技术上讲,第一个响应也是格式良好的JSON,因为数组已经字符串化,并作为“{potato,rutabaga}”发送。这需要我去处理我得到的响应的解析,虽然这还不是世界末日,但如果它被证明是不必要的,那就有点痛苦了

在行上调用row_to_json首先将数组类型转换为其正确的json数组表示形式,但json对象上似乎没有设置减法类型运算符(上面问题中的hstore-hstore是如何在我的websocket连线上发送“这些列已更改”事件)。因此,任何关于如何在数据库中正确工作的建议都是欢迎的。(通过将数组字符串化到hstore中的方式进行改进,或者通过对json对象执行集合减法)。

如果您找不到任何自然解决方案,您可以始终信任正则表达式

create or replace function hj(json text)
returns text language plpgsql immutable
as $$
begin
    return 
        regexp_replace(
            regexp_replace(
                regexp_replace(
                    json, '([^"{]+?),', '"\1", ', 'g'),
                '([^"{ ]+?)}"', '"\1"]', 'g'),
            '"{"', '["', 'g');
end $$;

select hj('{"id": "283", "tags": "{potato,rutabaga}", "reply_parents": "{7}"}');
-- gives:
-- {"id": "283", "tags": ["potato", "rutabaga"], "reply_parents": ["7"]}

为什么要将一行转换为hstore,然后将该hstore转换为JSON?直接转到JSON不是更有意义吗?@muistooshort查看链接问题。我在更新触发器中执行此操作,以确定哪些列已更改。因此,我可以在触发器中执行
hstore(NEW.*)-hstore(OLD.*)
,并获取更改的字段。遗憾的是,json数据类型没有相同类型的操作。
“id”:“283”
也是一个问题,实际上应该是
“id”:283
。根本的问题是,由于您使用的是hstore,所以所有内容都被字符串化了。我认为hstore和json(目前)不适合您尝试做的事情。也许你应该手工完成这一切,直到改进的jsonb东西可用为止。没错,尽管我已经在处理一般的字符串/int问题,在javascript中通过字符串索引访问对象时,parseInt在幕后被调用(例如,foo['1']==foo[1])。另外:hstore_to_json_loose将引用整数和布尔值等,因此它似乎比另一个更可取。这是我目前正在做的plpgsql版本-另一端是我的javascript前端,也就是说,“嘿,如果JSON.parse给了我一个字符串而不是预期的数组,我将通过正则表达式将其转换为数组”。它可以正常工作(特别是因为我编写的js ORM期望在线路上键入数据-我真的应该找到一种方法自动从db中提取数据).我不明白这个细微的差别。服务器只是给你想要的。当然,我不会和你争论:)
create or replace function hj(json text)
returns text language plpgsql immutable
as $$
begin
    return 
        regexp_replace(
            regexp_replace(
                regexp_replace(
                    json, '([^"{]+?),', '"\1", ', 'g'),
                '([^"{ ]+?)}"', '"\1"]', 'g'),
            '"{"', '["', 'g');
end $$;

select hj('{"id": "283", "tags": "{potato,rutabaga}", "reply_parents": "{7}"}');
-- gives:
-- {"id": "283", "tags": ["potato", "rutabaga"], "reply_parents": ["7"]}