首页 > 解决方案 > JSON初学者:(我可以/我如何/应该)以特定方式将干净的JSON数组自动转换为许多SQL表?

问题描述

背景:我是 JSON 初学者和高级 SQL 初学者。我正在尝试学习如何使用 MySQL 解析 JSON,我想出了以下问题来尝试解决。这可能是一件愚蠢的事情——让我知道。

术语:据我了解,我可以将一对花括号(“{..}”)之间的所有内容称为“对象”,而将由“:”分隔的每一对事物称为“键值”对”以及一对括号(“[..]”)之间的所有内容作为“数组”。这是我将在下面使用的术语,但如果那是错误的,那么我会更改它。

问题:这个问题有很多潜在的错误假设。我想从一个 JSON 数组开始,然后做以下事情。(我可以/我应该/我怎么能)这样做?

  1. 将 [a,b,c,...] 形式的每个数组转换为 {"1":a,"2":b,"3":c,...} 形式的对象,包括满足以下条件的数组位于其他对象或数组中。(除非不要对最外层的数组执行此操作。)

  2. 对于值有时是对象有时不是对象的每个键,将其所有关联的“非对象”值 x 转换为 {"genericvalue" : x} 形式的对象。

  3. 在 JSON 文件中查找一个从未用作键的字符串;叫它 f。

  4. 对于每个对象,添加一个等于“f”的键值对:i,其中 i 是一个整数,使得没有两个对象具有相同的键值对“f”:i。(尝试创建某种唯一标识符。)

  5. 将“键路径”定义为键序列 {k_1,k_2,k_3...k_n},使得与 k_1 关联的值是包含 k_2 的对象,与 k_2 关联的值是包含 k_3 的对象,依此类推。枚举与 JSON 文件关联的所有“关键路径”。

  6. 对于每个“关键路径”,请执行以下操作:

    1. 如果此键路径从来没有关联的键值对,其值为对象,则不要创建表。

    2. 如果此键路径始终具有关联的键值对,其值为对象,则创建一个表,其中包含与此键路径关联的任何对象中出现的每个键的一列,以及另一列称为 f_parent。

    3. 我认为以上应该是唯一的可能性,因为第 2 步。

  7. 对于每个对象 o,在与其键路径关联的表中创建一行,其中包含以下字段值:

    1. 如果 o 嵌套在另一个对象中,“f_parent”列应该等于与包含 o 的对象中的键“f”关联的值。否则,“f”列应该为空。
    2. 对于所有其他列 {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。

然后我想制作下表:

“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对象)”的东西)。

标签: mysqljson

解决方案


推荐阅读