Мне нужно преобразовать строку JSON в JSON в запросе Oracle.
Пример строки:
{\"1\":{\"qid\":1,\"aid\":1,\"a\":\"Yes\",\"isdyn\":0},\"2\":{\"qid\":2,\"aid\":7,\"a\":\"sdfbsjkb\",\"isdyn\":1},\"3\":{\"qid\":2,\"aid\":7,\"a\":\"sdfbsjkb\",\"isdyn\":1}}
а затем сохранить в таблице столбцов Oracle с ограничением Valid JSON.
Как я могу сделать то же самое в Oracle и какой подход лучше всего?
Просматриваю эту страницу сейчас, спасибо, что поделились.
Oracle сам по себе не имеет значения. Даже Oracle 12c не имеет смысла. Какой у вас полный номер версии? Ответ, скорее всего, будет зависеть от этого.
Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64-разрядная версия

Используйте REPLACE, чтобы удалить обратную косую черту перед кавычками. Затем вы можете вставить их в таблицу и сохранить как обычный JSON.
CREATE TABLE t_json (
id INTEGER
GENERATED ALWAYS AS IDENTITY,
json_col CLOB
CONSTRAINT ensure_json CHECK ( json_col IS JSON ) --Is a valid json
);
INSERT INTO t_json ( json_col )
SELECT replace('{\"1\":{\"qid\":1,\"aid\":1,\"a\":\"Yes\",\"isdyn\":0},\"2\":{\"qid\":2,\"aid\":7,\"a\":\"sdfbsjkb\",\"isdyn\":1},\"3\":{\"qid\":2,\"aid\":7,\"a\":\"sdfbsjkb\",\"isdyn\":1}}'
,'\"','"')
FROM dual;
1 row inserted.
Доступ к элементам
select t.json_col."1".a from t_json t;
A
----
Yes
Однако, используя тот же подход, что, если в реальном JSON есть специальный символ, например \"a\":\"Yes\#\", тогда \# также необходимо заменить на #. Я думаю, что когда объект JSON преобразуется в строку JSON, \ добавляется с каждым специальным символом. Итак, логика будет как у replace(\ any special character,any special character). Пожалуйста, предложите.
@Tajinder: Вы спрашиваете больше о том, как преобразовать строку, а не о преобразовании в JSON. Этот вопрос отвечает на ваш исходный вопрос. Вы можете попробовать REGEXP_REPLACE( '\"a\":\"Yes\#\"' ,'\\(["#])','\1') заменить что-либо, за которым следует люфт, только самим символом. Если у вас есть еще что-то, что нужно заменить / изменить, попробуйте задать отдельный вопрос с соответствующими деталями. Вы можете принять этот ответ, если считаете, что он вам помог.
Извините, если вопрос был непонятен. Строка, указанная в вопросе, была просто примером. Надеюсь, теперь все ясно. Я тоже редактировал вопрос. Можете проверить и подсказать.
with input as ( select
'{\"1\":{\"qid\":1,\"aid\":1,\"a\":\"Yes\",\"isdyn\":0},\"2\":{\"qid\":2,\"aid\":7,\"a\":\"sdfbsjkb\",\"isdyn\":1},\"3\":{\"qid\":2,\"aid\":7,\"a\":\"sdfbsjkb\",\"isdyn\":1}}'
txt
from dual
)
select json_value(
'["' || txt || '"]',
'$[0]'
error on error
) json_txt
from input;
{"1": {"qid": 1, "aid": 1, "a": "Да", "isdyn": 0}, "2": {"qid": 2, "aid": 7, "a": "sdfbsjkb", "isdyn": 1}, "3": {"qid": 2, "aid": 7, "a": "sdfbsjkb", "isdyn": 1}}
JSON_VALUE просто снял экранирование всего за вас.
С наилучшими пожеланиями, Стью Эштон
Вы читали это