Подтвердить что ты не робот

Postgres: Как преобразовать строку json в текст?

Значение Json может состоять из значения жало. Например.

postgres=# SELECT to_json('Some "text"'::TEXT);
     to_json
-----------------
 "Some \"text\""

Как извлечь эту строку как текстовое значение postgres?

::TEXT не работает. Он возвращает цитированный json, а не исходную строку:

postgres=# SELECT to_json('Some "text"'::TEXT)::TEXT;
     to_json
-----------------
 "Some \"text\""

Спасибо.

P.S. I'm usnig PostgreSQL 9.3

4b9b3361

Ответ 1

В PostgreSQL нет возможности деконструировать скалярный объект JSON. Таким образом, как вы указываете,

select  length(to_json('Some "text"'::TEXT) ::TEXT);

составляет 15,

Хитрость заключается в преобразовании JSON в массив одного элемента JSON, а затем извлечение этого элемента с помощью ->>.

select length( array_to_json(array[to_json('Some "text"'::TEXT)])->>0 );

вернется 11.

Ответ 2

В 9.4.4 с помощью оператора #>> работает для меня:

select to_json('test'::text) #>> '{}';

Для использования со столбцом таблицы:

select jsoncol #>> '{}' from mytable;

Ответ 3

Простой способ сделать это:

SELECT  ('[' || to_json('Some "text"'::TEXT) || ']')::json ->> 0;

Просто преобразуйте строку json в список json

Ответ 4

Этот вопрос/решение порождает еще один вопрос... манифест для разработчиков PostgreSQL:
Зачем бросать JSON-строку в кавычки SQL-текста?
О, есть некоторые dillema... Почему бы не спросить пользователей, что они предпочитают?

В SQL литье char (N) производит ожидаемый текст без котировок; во встроенном языке или драйвере, литье SQL-текста создает ожидаемый строковый тип данных без кавычек, строка литья вызывает ожидаемый SQL-текст без котировок... Это универсальное ожидаемое поведение...