我在PostgreSQL数据库(9.4.1)的JSON(而不是JSONB)列中存储了一些JSON数据。其中一些JSON结构在属性值中包含Unicode序列。例如:
{"client_id": 1, "device_name": "FooBar\ufffd\u0000\ufffd\u000f\ufffd" }
当我试图查询这个JSON列时(即使我没有直接尝试访问device_name
属性)时,将得到以下错误:
ERROR: unsupported Unicode escape sequence
Detail:\u0000cannot be converted to text.
可以通过在PostgreSQL服务器上执行以下命令重新创建此错误:
select '{"client_id": 1, "device_name": "FooBar\ufffd\u0000\ufffd\u000f\ufffd" }'::json->>'client_id'
这个错误对我来说是有意义的--根本就没有方法来表示unicode序列。NULL
在文本结果中。
我是否有任何方法可以查询相同的JSON数据,而不必对传入的数据执行“sanitation”操作?
发布于 2018-03-07 12:58:46
\u0000
在字符串中无效的一个Unicode代码点。
json
只是一个特定格式的字符串,您可以使用标准的字符串函数,而不必担心JSON结构:
SELECT (regexp_replace(the_string::text, '\\u0000', '', 'g'))::json;
发布于 2018-03-07 13:41:02
首先,我可以通过书写来再现错误:
select json '{ "a": "null \u0000 escape" }' ->> 'a' as fails
然后,我添加了一个自定义函数,用于查询:
CREATE OR REPLACE FUNCTION null_if_invalid_string(json_input JSON, record_id UUID)
RETURNS JSON AS $$
DECLARE json_value JSON DEFAULT NULL;
BEGIN
BEGIN
json_value := json_input ->> 'location';
EXCEPTION WHEN OTHERS
THEN
RAISE NOTICE 'Invalid json value: "%". Returning NULL.', record_id;
RETURN NULL;
END;
RETURN json_input;
END;
$$ LANGUAGE plpgsql;
要调用该函数,请执行以下操作。您不应该收到错误。
select null_if_invalid_string('{ "a": "null \u0000 escape" }', id) from my_table
而这应该会像预期的那样返回JSON:
select null_if_invalid_string('{ "a": "null" }', id) from my_table
https://stackoverflow.com/questions/-100007532
复制相似问题