Сохранение JSON строки в БД

Есть столбец body в таблице operation:

create table operation (
    id             number(32, 2) not null,
    product_name   varchar2(50)  not null,
    body           varchar2(4000),

    constraint pk_operation  primary key (id) using index,
    constraint chk_body      check (body is json)
)

в котором хранятся JSON совершенно разных объектов.

Объекты эти приходят в очереди, тело которой содержит поле String body с JSON. И перед записью в БД я проверяю что пришедший body содержит корректный JSON:

public static boolean isJSONValid(String jsonInString) {
     try {
         final ObjectMapper mapper = new ObjectMapper();
         mapper.readTree(jsonInString);
         return true;
     } catch (IOException e) {
         log.debug("Wrong json data " + e.getMessage());
         return false;
     }
 }

Подскажите, на сколько такой подход верный, и может быть есть более верное решение?


Ответы (2 шт):

Автор решения: Roman C

Нет необходимости парсить json перед записью в бд Oracle. Ведь на таблице стоит констрейнт

constraint chk_body      check (body is json)

Поэтому проверка json происходит при записи в бд самой бд. В случае если json неверный выдаётся исключение нарушения констрейнта.

→ Ссылка
Автор решения: 0xdb

Дополню правильный ответ уважаемого @Roman C.

Что произойдёт при вставке с ограничением CHECK (column IS JSON).

Условие IS JSON, как сказано в документации:

IS JSON Condition
Use this SQL/JSON condition to test whether an expression is syntactically correct, or well-formed, JSON data.

If you specify IS JSON, then this condition returns TRUE if the expression is well-formed JSON data and FALSE if the expression is not well-formed JSON data.

только проверяет синтаксис JSON данных данных возвращая TRUE или FALSE. Каких-либо диагностических сообщений для локализации причины ошибки, не будет.

В ограничении это условие приведёт к его нарушению и данные вставлены не будут:

create table t (id int, body clob, constraint chk_body check (body is json));

insert into t values (1, '{"items":{["item":{"id":1,"name":"item 1"}}]}');
                                ---^^       
ORA-02290: check constraint (SH.CHK_BODY) violated

Подскажите на сколько такой подход верный

Ответ на этот вопрос зависит от того, что ожидается, если данные будут потеряны. Обычно это недопустимо. Поэтому, после получения исключения от первой вставки, возможно сохранить JSON данные как есть в дополнительную таблицу ощибок, где для соответствующего столбца не установленно ограничение.

→ Ссылка