【发布时间】:2022-12-11 00:25:52
【问题描述】:
使用的数据库:我使用的是 Oracle 19c 数据库,所以我尝试使用已在 PLSQL 中声明的 JSON 函数(例如 JSON_TABLE)将 JSON 导入数据库表中。
我在做什么:
我只是调用 API,从中获取 JSON,然后我想在数据库中导入数据,无论数据是什么,它们以什么结构出现。
问题:
我想在不知道 JSON 中的元素名称的情况下迭代 JSON 数据。 我想知道我实际上在哪里(当前节点的名称)以及子元素的名称,因此我可以根据这些名称动态创建表,添加它们之间的关系,并导入所有数据。
我试过的:
到目前为止,我都是手动操作的——我必须自己创建表格。导入数据需要了解对象名称,还需要了解我要导入的 JSON 结构。它的工作原理,但是哦,好吧……我想创造一些更通用的东西。所有这些事情都必须完成,因为我不知道有什么方法可以在不知道对象名称和通常的整个 JSON 结构的情况下遍历 JSON 结构。
在不知道对象名称和它们之间的关系的情况下如何遍历 json 结构的任何想法?
【问题讨论】:
-
您可能认为,在找到一种遍历 JSON 树并从中生成表的方法后,您就可以完成,但是如果没有人使用这些数据,存储的数据就没有任何价值。那么另一个问题出现了:消费者如何知道数据的结构?关系表设计为具有预定义结构的静态对象。如果你需要存储一些非结构化数据,那么store original JSON。或者描述你想要实现的总体目标。
-
@astentx '如果没有人使用这些数据,存储的数据就没有任何价值' - 更容易找出表格形式的 json 中的内容(例如:客户可以使用常见的 sql 函数聚合数据)。客户还可以轻松地从中生成报告,而当我们将原始 JSON 存储在数据库中时,这是很难实现的。当然,在某些情况下,创建的表格可能没有那么有用,因为开发人员会根据文档创建它们。但在某些情况下,我可以节省很多时间,客户不必等待第一个可见的效果。
-
所以有很多子步骤要执行:1)获取顶级元素并为其生成唯一标识符(以建立关系)2)获取JSON结构; 3) 生成表名以插入或从生成的名称集合中获取现有表名(取决于属性路径和类型); 4)检查表结构是否必须扩展/改变(对于最简单的每个属性在所有对象中具有相同数据类型的情况);不要忘记生成标识符的列!这是不是实际的表, 但表定义的内部表示
-
5) 将当前内部“表”结构与实际数据库表结构进行比较,生成
create/alter语句; 6) 将数据插入表中,仅提供当前对象的匹配列/属性、其唯一标识符和父标识符; 7) 对每个结构化元素(数组、对象)进行递归调用,传递生成的父对象标识符和父对象全路径(生成表名)。这是应该做什么的非常简单的结构,对于单个问题来说当然太多了。这是一项复杂的任务 -
要构建 JSON 数据的结构,您可以使用
JSON_DATAGUIDE聚合函数或JSON_ELEMENT_T的迭代方法调用is_[scalar|object|array]、get_keys和get_type