如何在 CSV 下表示 JSON 对象
How to represent JSON object under CSV
我想将一个 JSON 对象导出到 CSV 文件,其中的子字段可能由对象数组填充,但我不知道如何表示CSV 中的嵌入数据。
csv 的表现力不如 json。但是有很多方法可以在 csv 中伪造一个 json 结构。例如:
https://konklone.io/json/?id=a624ffaa84db538b4a10465c72bf393d
更多相关信息:
http://blog.appliedinformaticsinc.com/how-to-parse-and-convert-json-to-csv-using-python/
这归结为将 semi-structured (tree-like) 数据映射到表格数据。由于阻抗不匹配,这根本不是微不足道的。
在实践中有几种常用(和教授)的方法,并且经过广泛的学术研究,主要是为 XML 建立的,但原则上也可以应用于 JSON。方法或多或少归结为:
- Ad-hoc (schema-based) 映射
- 切边
- 树编码
首先,如果您的数据遵循规则模式(如架构),您可以设计一个 ad-hoc 映射,例如,可以将每个叶(值)映射到 CSV 中的列。您可以使用点保留有关结构的信息,前提是字段中尚未使用点。
例如:
{
"foo" : {
"bar" : 10
},
"foobar" : "foo"
}
可以映射到:
| foo.bar | foobar |
|---------|--------|
| 10 | foo |
棘手的部分是当游戏中有数组时。如果你有一大堆相似的对象,你可以让它们成为输出 CSV 中的所有行:
{
"objects" : [
{
"foo" : {
"bar" : 10
},
"foobar" : "foo"
},
{
"foo" : {
"bar" : 40
},
"foobar" : "bar"
},
{
"foo" : {
"bar" : 50
},
"foobar" : "bar"
}
]
}
可以映射到:
| objects.pos | objects.foo.bar | objects.foobar |
|-------------|-----------------|----------------|
| 1 | 10 | foo |
| 2 | 40 | bar |
| 3 | 50 | bar |
这是最简单的方法,因为输出 CSV 仍然很容易理解,但它需要为每个用例重新设计它以使其适应您的数据,特别是对于数组中的不同排列。
从理论的角度来看,这第一种 ad-hoc 方法称为 规范化 数据,即将其转化为第一范式或更高范式。
还有其他更通用的方法,例如边缘分解和树编码。对于您的用例,它们可能做得过头了,因为解码它们需要相当多的工作,因此它们更适合在关系数据库之上实现复杂的 XML 查询。
简而言之,通过边缘切碎,您可以为存储叶子的每种类型(在 JSON 中为数字、字符串、布尔值等)创建一个 table(CSV 文件) ,并有一个 table 用于存储原始 JSON 树的边缘。
使用 tree encoding,您只需使用一个 table(CSV 文件)即可巧妙地存储树的所有节点和叶子。同样,它针对 XML 进行了调整,但可能会进行调整。
JSON 比 XML 年轻一点,所以我不确定在映射到 table 方面已经做了多少研究——可能还有专门针对 JSON 而不是 XML 的一般映射,即使一般原则相似。
我想将一个 JSON 对象导出到 CSV 文件,其中的子字段可能由对象数组填充,但我不知道如何表示CSV 中的嵌入数据。
csv 的表现力不如 json。但是有很多方法可以在 csv 中伪造一个 json 结构。例如:
https://konklone.io/json/?id=a624ffaa84db538b4a10465c72bf393d
更多相关信息: http://blog.appliedinformaticsinc.com/how-to-parse-and-convert-json-to-csv-using-python/
这归结为将 semi-structured (tree-like) 数据映射到表格数据。由于阻抗不匹配,这根本不是微不足道的。
在实践中有几种常用(和教授)的方法,并且经过广泛的学术研究,主要是为 XML 建立的,但原则上也可以应用于 JSON。方法或多或少归结为:
- Ad-hoc (schema-based) 映射
- 切边
- 树编码
首先,如果您的数据遵循规则模式(如架构),您可以设计一个 ad-hoc 映射,例如,可以将每个叶(值)映射到 CSV 中的列。您可以使用点保留有关结构的信息,前提是字段中尚未使用点。
例如:
{
"foo" : {
"bar" : 10
},
"foobar" : "foo"
}
可以映射到:
| foo.bar | foobar |
|---------|--------|
| 10 | foo |
棘手的部分是当游戏中有数组时。如果你有一大堆相似的对象,你可以让它们成为输出 CSV 中的所有行:
{
"objects" : [
{
"foo" : {
"bar" : 10
},
"foobar" : "foo"
},
{
"foo" : {
"bar" : 40
},
"foobar" : "bar"
},
{
"foo" : {
"bar" : 50
},
"foobar" : "bar"
}
]
}
可以映射到:
| objects.pos | objects.foo.bar | objects.foobar |
|-------------|-----------------|----------------|
| 1 | 10 | foo |
| 2 | 40 | bar |
| 3 | 50 | bar |
这是最简单的方法,因为输出 CSV 仍然很容易理解,但它需要为每个用例重新设计它以使其适应您的数据,特别是对于数组中的不同排列。
从理论的角度来看,这第一种 ad-hoc 方法称为 规范化 数据,即将其转化为第一范式或更高范式。
还有其他更通用的方法,例如边缘分解和树编码。对于您的用例,它们可能做得过头了,因为解码它们需要相当多的工作,因此它们更适合在关系数据库之上实现复杂的 XML 查询。
简而言之,通过边缘切碎,您可以为存储叶子的每种类型(在 JSON 中为数字、字符串、布尔值等)创建一个 table(CSV 文件) ,并有一个 table 用于存储原始 JSON 树的边缘。
使用 tree encoding,您只需使用一个 table(CSV 文件)即可巧妙地存储树的所有节点和叶子。同样,它针对 XML 进行了调整,但可能会进行调整。
JSON 比 XML 年轻一点,所以我不确定在映射到 table 方面已经做了多少研究——可能还有专门针对 JSON 而不是 XML 的一般映射,即使一般原则相似。