如需转载请标明出处:直到世界的尽头-张小凡-http://my.525.life
有简单的json结构如下:
{
“id”: “0001”,
“name”: “Joe”,
“age”: 88
}
保存在test.json文件中。
我们使用kettle来尝试json输入进行解析保存到mongodb。
构造转换流程如下:
Json Input到字段选择到mongodb Output
左键点击Json input,在文件栏 点击浏览 选中test.json,点击增加。
点击字段,输入需要获取的字段和路径。
因为json输入不能自动获取字段,所以路径需要我们自己填写。
填写路径前需要了解几个符号。
$号表示根元素
.表示子操作
[]表示数组操作
[,]表示路径操作
输入如图:
路径为
.id . i d .name
.age . a g e .name 表示根目录子集的name,如果是两层则可以$..name表示根目录子集的子集。
预览可查看到结果
因为字段选择和mongodb输出之前都有讲过,这里就不详细解说了。
清洗Json输入的关键在于了解和构造路径。
json一般来说不会只有一层,基本上都会有嵌套。
我们现在来看看2层嵌套的情况。
有json结构如下:
{
“id”: “0001”,
“name”: “Joe”,
“age”: 88,
“children”: [
{
“id”: “0002”,
“name”: “Jay”,
“age”: 52
}
]
}
保存在test2.json中。
则在字段获取时输入路径为
.id . i d .name
.age . a g e .children
则预览时如图:
我们可以看到 children的元素已经被装在children字段中了,这里我们为了解析第二层children,需要再增加一个Json输入。
在第二个Json输入的文件配置时 勾选 源定义在一个字段里,选择children字段。
解析第二层数据的字段配置如下:
路径为:
.[∗]id . [ ∗ ] i d .[*]name
.[∗]age . [ ∗ ] a g e .[*]children
$.[*]name含义为根元素的子集数组的name。
*表示所有,也就是 数组中如果有多个{}元素都会获取到name。
因为字段当作源时不能直接预览,所以可以先填写MongoDB Output和在字段选择中获取字段,删除children字段,然后在解析第二层数据右键Preview一下。
结果如图:
这样就完成了两层树的解析。
但是这样的弊端很多,有x层就需要json输入处理x次,还需要分列才能存储。
经过思考 我们有个更好的方法用来解决嵌套json的抽取问题:未知层数嵌套json结构抽取。
我们在已知层数抽取中已经知道*号能够自动获取数组中所有的数组中的元素,而且能够嵌套获取。
那我们能不能把json构造在数组来处理。
比如我们有json结构如下:
{
“id”: “0001”,
“name”: “Joe”,
“age”: 88,
“children”: [
{
“id”: “0002”,
“name”: “Jay”,
“age”: 52,
“children”: [
{
“id”: “0003”,
“name”: “zoe”,
“age”: 23,
“children”: []
}
]
}
]
}
存放在test3.json中。
我们都知道 kettle是支持使用脚本的,包括java和javascript等语言。
我们可以选取熟悉的语言来进行操作。
具体操作流程可以参考:
kettle案例四使用java脚本进行数据处理
如需转载请标明出处:直到世界的尽头-张小凡-http://my.525.life