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;
}
}
告诉我,这种方法在多大程度上是正确的,也许还有更正确的解决方案?
我将补充受人尊敬的@Roman C的正确答案。
使用约束插入时会发生什么
CHECK (column IS JSON)。条件是 JSON,如文档所述:
TRUE仅通过返回or来检查给定数据的 JSON 语法FALSE。将没有诊断消息来定位错误的原因。在约束中,这个条件会导致它的违反,数据不会被插入:
这个问题的答案取决于数据丢失时的预期。这通常是不允许的。因此,在第一次插入异常后,可以将 JSON 数据按原样存储在相应列不受约束的附加错误表中。
在写入 Oracle 数据库之前无需解析 json。毕竟表是有约束的
因此,在写入数据库本身的数据库时会发生 json 验证。如果 json 无效,则抛出约束冲突异常。