mysql - JSON初学者:(我可以/我如何/应该)以特定方式将干净的JSON数组自动转换为许多SQL表?
问题描述
背景:我是 JSON 初学者和高级 SQL 初学者。我正在尝试学习如何使用 MySQL 解析 JSON,我想出了以下问题来尝试解决。这可能是一件愚蠢的事情——让我知道。
术语:据我了解,我可以将一对花括号(“{..}”)之间的所有内容称为“对象”,而将由“:”分隔的每一对事物称为“键值”对”以及一对括号(“[..]”)之间的所有内容作为“数组”。这是我将在下面使用的术语,但如果那是错误的,那么我会更改它。
问题:这个问题有很多潜在的错误假设。我想从一个 JSON 数组开始,然后做以下事情。(我可以/我应该/我怎么能)这样做?
将 [a,b,c,...] 形式的每个数组转换为 {"1":a,"2":b,"3":c,...} 形式的对象,包括满足以下条件的数组位于其他对象或数组中。(除非不要对最外层的数组执行此操作。)
对于值有时是对象有时不是对象的每个键,将其所有关联的“非对象”值 x 转换为 {"genericvalue" : x} 形式的对象。
在 JSON 文件中查找一个从未用作键的字符串;叫它 f。
对于每个对象,添加一个等于“f”的键值对:i,其中 i 是一个整数,使得没有两个对象具有相同的键值对“f”:i。(尝试创建某种唯一标识符。)
将“键路径”定义为键序列 {k_1,k_2,k_3...k_n},使得与 k_1 关联的值是包含 k_2 的对象,与 k_2 关联的值是包含 k_3 的对象,依此类推。枚举与 JSON 文件关联的所有“关键路径”。
对于每个“关键路径”,请执行以下操作:
如果此键路径从来没有关联的键值对,其值为对象,则不要创建表。
如果此键路径始终具有关联的键值对,其值为对象,则创建一个表,其中包含与此键路径关联的任何对象中出现的每个键的一列,以及另一列称为 f_parent。
我认为以上应该是唯一的可能性,因为第 2 步。
对于每个对象 o,在与其键路径关联的表中创建一行,其中包含以下字段值:
- 如果 o 嵌套在另一个对象中,“f_parent”列应该等于与包含 o 的对象中的键“f”关联的值。否则,“f”列应该为空。
- 对于所有其他列 {k_1,k_2,...k_n},该列应为 a) 如果 k_n 不是出现在 o 中的键,则该列应为 null,或者如果 k_n 是出现在 o 中的键。
示例:我想从这样的 JSON 数组开始:
[
{
"color": "pink",
"flavor": "strawberry",
"ingredients": {
"1": "strawberries",
"2": "chemical x"
}
},
{
"color": "green",
"flavor": "pancake",
"tags": [
"breakfast",
"green"
]
},
{
"color": "red",
"flavor": "pumpkin spice",
"price": 3,
"ingredients": {
"0": "pumpkin",
"1": "spice"
},
"tags": "seasonal"
}
]
让我们设置 f 等于“recordid”。在步骤 1-3 之后,我想我希望它看起来像这样:
[
{
"recordid" : 1,
"color": "pink",
"flavor": "strawberry",
"ingredients": {
"recordid" : 2,
"1": "strawberries",
"2": "chemical x"
}
},
{
"recordid" : 3,
"color": "green",
"flavor": "pancake",
"tags": {
"recordid" : 4,
"1":"breakfast",
"2":"green"
}
},
{
"recordid" : 5,
"color": "red",
"flavor": "pumpkin spice",
"price": 3,
"ingredients": {
"recordid" : 6,
"0": "pumpkin",
"1": "spice"
},
"tags": {
"recordid" : 7,
"genericvalue":"seasonal"
}
}
]
所以基本上绿色煎饼的标签数组已经变成了一个对象,红色南瓜香料的单个“季节性”标签已经变成了一个对象,现在所有东西都有一个记录 ID。
然后我想制作下表:
“味道”(我编的);这是与空“关键路径”关联的表;字段将是
- recordid_parent(始终为空)
- 记录ID
- 颜色
- 味道
- 配料
- 标签
“口味。标签”;字段将是
- recordid_parent
- 记录ID
- 通用值
- 1
- 2
“香料。成分”;字段将是
- recordid_parent
- 记录ID
- 1
- 2
- 0
“flavors.ingredients”表如下所示:
recordid_parent | 记录ID | 1 | 2 | 0 |
---|---|---|---|---|
1 | 2 | 草莓 | 化学物质 x | 无效的 |
5 | 6 | 无效的 | 香料 | 南瓜 |
“flavors.tags”表如下所示:
recordid_parent | 记录ID | 1 | 2 | 通用值 |
---|---|---|---|---|
3 | 4 | 早餐 | 绿色 | 无效的 |
5 | 7 | 无效的 | 无效的 | 季节性 |
“口味”表如下所示:
recordid_parent | 记录ID | 颜色 | 味道 | 价格 | 配料 | 标签 |
---|---|---|---|---|---|---|
无效的 | 1 | 粉色的 | 草莓 | 无效的 | (JSON 对象) | (JSON 对象) |
无效的 | 3 | 绿色 | 饼子 | 无效的 | (JSON 对象) | (JSON 对象) |
无效的 | 5 | 红色的 | 南瓜香料 | 3 | (JSON 对象) | (JSON 对象) |
(我没有填写所有“(JSON对象)”的东西)。
解决方案
推荐阅读
- javascript - 如何使用 javascript 创建体育投注计算器
- python - 无法序列化对象:异常:您似乎正在尝试从广播变量中引用 SparkContext
- android-livedata - LiveData Observer 在初始化时调用 & ObserveOnce 不起作用
- c# - Unity 无法解析对象并抛出“System.IO.FileNotFoundException”
- django - Django ValidationErrors 未显示
- openshift - OpenShift:在 Yaml 中将 SCC 添加到服务帐户
- google-apps-script - 当我(工作簿的所有者)清除其内容时,如何自动删除 Google 表格中单元格上存在的所有保护?
- python - 不断收到 Login_info not defined 错误。尝试了几种不同的解决方案
- affinity - 检查 PF_NO_SETAFFINITY 的值
- javascript - 如何将度量查询为单个计算值(10 天平均值)而不是按粒度分隔(每日度量)?