Как преобразовать строку JSON в JSON в Oracle - PullRequest
0 голосов
/ 07 сентября 2018

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

Ответы [ 2 ]

0 голосов
/ 03 октября 2018
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, "помощь": 1, "а": "Да", "isdyn": 0}, "2": { "QID": 2, "помощь" : 7, "а": "sdfbsjkb", "isdyn": 1}, "3": { "QID": 2, "помощь": 7, "а": "sdfbsjkb", "isdyn": 1}}

JSON_VALUE просто удалил все для вас.

С уважением, Рагу Эштон

0 голосов
/ 08 сентября 2018

Используйте 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
...