Как преобразовать строку JSON в JSON в Oracle

Мне нужно преобразовать строку 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 и какой подход лучше всего?

Вы читали это

OldProgrammer 07.09.2018 21:59

Просматриваю эту страницу сейчас, спасибо, что поделились.

Tajinder 07.09.2018 22:02

Oracle сам по себе не имеет значения. Даже Oracle 12c не имеет смысла. Какой у вас полный номер версии? Ответ, скорее всего, будет зависеть от этого.

mathguy 07.09.2018 22:22

Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64-разрядная версия

Tajinder 08.09.2018 11:44
Как сделать HTTP-запрос в Javascript?
Как сделать HTTP-запрос в Javascript?
В JavaScript вы можете сделать HTTP-запрос, используя объект XMLHttpRequest или более новый API fetch. Вот пример для обоих методов:
0
4
2 000
2

Ответы 2

Используйте 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 09.09.2018 12:16

@Tajinder: Вы спрашиваете больше о том, как преобразовать строку, а не о преобразовании в JSON. Этот вопрос отвечает на ваш исходный вопрос. Вы можете попробовать REGEXP_REPLACE( '\"a\":\"Yes\#\"' ,'\\(["#])','\1') заменить что-либо, за которым следует люфт, только самим символом. Если у вас есть еще что-то, что нужно заменить / изменить, попробуйте задать отдельный вопрос с соответствующими деталями. Вы можете принять этот ответ, если считаете, что он вам помог.

Kaushik Nayak 09.09.2018 15:33

Извините, если вопрос был непонятен. Строка, указанная в вопросе, была просто примером. Надеюсь, теперь все ясно. Я тоже редактировал вопрос. Можете проверить и подсказать.

Tajinder 09.09.2018 15:45
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 просто снял экранирование всего за вас.

С наилучшими пожеланиями, Стью Эштон

Другие вопросы по теме