В PostgreSQL, как создать чистый JSON без обратной косой черты и внешних двойных кавычек? - PullRequest
0 голосов
/ 26 февраля 2019

Этот код PostgreSQL:

do
$j$
declare arr text[];

begin

arr = array_append(arr, jsonb_build_object('k', 'acg', 'v', 'val')::text);
arr = array_append(arr, jsonb_build_object('k', 'xyz', 'v', 'xxx')::text);

raise info '%', (array_to_json(arr));
end;
$j$

Создает это:

["{\"k\": \"acg\", \"v\": \"val\"}","{\"k\": \"xyz\", \"v\": \"xxx\"}"]

Я знаю, что могу запустить regexp_replace и очистить его, но нет способа сгенерироватьчистый JSON?

Как это ?:

[{"k": "acg", "v": "val"},{"k": "xyz", "v": "xxx"}]

Ответы [ 2 ]

0 голосов
/ 26 февраля 2019

Я думаю, что вы не намеревались использовать text здесь, но хотите jsonb.

Код будет выглядеть следующим образом:

DO                                                                          
$j$                                                                         
DECLARE                                                                     
   arr jsonb[];                                                             
BEGIN                                                                       
   arr = array_append(arr, jsonb_build_object('k', 'acg', 'v', 'val'));     
   arr = array_append(arr, jsonb_build_object('k', 'xyz', 'v', 'xxx'));     

   RAISE NOTICE '%', to_jsonb(arr);                                         
END;                                                                        
$j$;

То есть результат:

NOTICE:  [{"k": "acg", "v": "val"}, {"k": "xyz", "v": "xxx"}]
0 голосов
/ 26 февраля 2019

Дополнительные символы, которые вы видите , не являются частью значения , только отображаемого представления.

Создает это:

["{\"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, которое требует экранирования его специальногосимволы для вывода;или с использованием текстовой строки в другом месте (например, передать значение другой функции) в качестве фактического значения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...