如何在 CSV 下表示 JSON 对象

awz*_*wzx 2 javascript python csv json export-to-csv

我想将 JSON 对象导出到 CSV 文件,其中的子字段可能由对象数组填充,但我不知道如何在 CSV 中表示嵌入的数据。

Ghi*_*rny 5

这归结为将半结构化(树状)数据映射到表格数据。由于阻抗不匹配,这根本不是小事。

有几种在实践中常用(和教授)的方法,以及广泛的学术研究,大部分是针对 XML 建立的,但原则上也可以应用于 JSON。方法或多或少可以归结为:

  • 即席(基于模式)映射
  • 边缘撕碎
  • 树编码

首先,如果您的数据遵循常规模式(如架构),则可以设计一个临时映射,例如,将每个叶(值)映射到 CSV 中的列。您可以使用点保留有关结构的信息,假设字段中尚未使用点。

例如:

{
  "foo" : {
    "bar" : 10
  },
  "foobar" : "foo"
}
Run Code Online (Sandbox Code Playgroud)

可以映射到:

| foo.bar | foobar |
|---------|--------|
|  10     |  foo   |
Run Code Online (Sandbox Code Playgroud)

更棘手的部分是当游戏中有数组时。如果您有大量相似对象,则可以将它们设为输出 CSV 中的所有行:

{
  "objects" : [
    {
      "foo" : {
        "bar" : 10
      },
      "foobar" : "foo"
    },
    {
      "foo" : {
        "bar" : 40
      },
      "foobar" : "bar"
    },
    {
      "foo" : {
        "bar" : 50
      },
      "foobar" : "bar"
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

可以映射到:

| objects.pos | objects.foo.bar | objects.foobar |
|-------------|-----------------|----------------|
|       1     |      10         |     foo        |
|       2     |      40         |     bar        |
|       3     |      50         |     bar        |
Run Code Online (Sandbox Code Playgroud)

这是最简单的方法,因为输出 CSV 仍然很容易理解,但它需要为每个用例重新设计它以适应您的数据,特别是对于数组中的不同排列。

从理论角度来看,这种第一种临时方法称为数据标准化,即使其达到第一范式或更高范式。

还有其他更通用的方法,例如边缘粉碎和树编码。对于您的用例来说,它们可能做得太过分了,因为解码它们需要相当多的工作,因此它们更适合在关系数据库之上实现复杂的 XML 查询。

简而言之,通过边缘粉碎,您可以为存储叶子的每种类型(JSON 中的数字、字符串、布尔值等)创建一个表(CSV 文件),并拥有一个表来存储原始边缘JSON 树。

通过树编码,您只需使用一张表(CSV 文件)即可智能地存储树的所有节点和叶子。同样,它针对 XML 进行了调整,但可能还可以进行调整。

JSON 比 XML 年轻一些,所以我不确定在映射到表方面已经做了多少研究——可能还有专门针对 JSON 而不是 XML 的通用映射,尽管一般原则是相似的。