Дополнительные символы, которые вы видите , не являются частью значения , только отображаемого представления.
Создает это:
["{\"k\": \"acg\", \"v\": \"val\"}","{\"k\": \"xyz\", \"v\": \"xxx\"}"]
Это (выходное представление) массива с двумя элементами;каждый элемент представляет собой строку JSON.Это то, что ваш код запрашивал:
arr = array_append(arr, jsonb_build_object('k', 'acg', 'v', 'val')::text);
arr = array_append(arr, jsonb_build_object('k', 'xyz', 'v', 'xxx')::text);
Если вы собираетесь использовать JSON, вы определенно хотите, чтобы это была текстовая строка, которую вы получаете.
представление этой строки, разумеется, должно быть экранировано специальными символами, чтобы понять, какие символы являются частью строки, а какие нет.
Значение текстовой строки, значение которого равно{"k": "acg", "v": "val"}
будет отображаться для отображения с некоторыми из тех символов, которые экранированы обратной косой чертой, "{\"k\": \"acg\", \"v\": \"val\"}"
.Обратная косая черта и окружающие кавычки и другие дополнительные символы не являются частью значения.
Поэтому вам нужно выбрать между рендерингом значения для отображения в виде литерального значения PostgreSQL, которое требует экранирования его специальногосимволы для вывода;или с использованием текстовой строки в другом месте (например, передать значение другой функции) в качестве фактического значения.