我正在尝试使用 PostgreSQL 9.3 中的新 JSON 功能,并且我正在寻找一个对 JSON 进行转义的函数,to_json(anyelement) 的反义词。
下面是一个示例 JSON:
{"single_comment": "Fred said \"Hi.\"" ,
"comments_array": ["Fred said \"Hi.\"", "Fred said \"Hi.\"", "Fred said \"Hi.\""]}
查询:
SELECT json_array_elements(json_column->'comments_array')
如文档中所述返回一组 JSON。
"Fred said \"Hi.\""
"Fred said \"Hi.\""
"Fred said \"Hi.\""
有没有办法对结果进行转义,这样我就可以得到如下结果:
Fred said "Hi."
Fred said "Hi."
Fred said "Hi."
在文档中我没有看到任何可以帮助我的函数。不幸的是,安装 PLV8 对我来说不是一个选择。
非常感谢任何想法。
最佳答案
在其他网站上找到一些简单的东西: 来源here
链接失效的详细信息:
select (ingredients #>> '{}')::jsonb->>'cheese' from pizza;
这样做☝️。当你有一个带有 jsonb 列(成分)的表(披萨)时,你不小心将转义的 JSON 字符串而不是 JSON 对象放入该列中。该值可能如下所示:
"{\"cheese\": \"mozzarella\"}"
看到报价了吗?这只是该 JSON 列内根级别的一个字符串。但你真正想要的是这样的:
{"cheese": "mozzarella"}
这样更好。但是我们已经犯了错误,所以我们必须编写一个迁移来修复数据。以下是我们的做法:
(ingredients #>> '{}')::jsonb
Postgres 中的 #>>
运算符获取“指定路径处的 JSON 对象作为文本”(PostgreSQL: Documentation: 9.3: JSON Functions and Operators)。这里我们传入一个空路径,表示我们希望 Postgres 在根级别为我们提供未转义的字符串作为 text
值。
然后我们可以像这样将该 text
值转换回 JSON:(stand-in-for-text-value)::jsonb
。然后我们在根级别有一个正常的、解析的 JSON 对象,我们可以从中选择字段。
关于json - PostgreSQL 转义 JSON 字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19414361/