JoltTransformJSON 数据封装
目的
将JSON数据(无论JSON对象还是数组)封装到一JSON对象中作为某一字段的值。
示例说明
输入数据:
[
{
"name": "Google",
"url": "http://www.google.com"
},
{
"name": "Baidu",
"url": "http://www.baidu.com"
}
]
期望输出数据:
{
"status": "success",
"message": "处理成功",
"timestamp": "xxxxxxx",
"data": {
"label": "网站",
"links": [
{
"name": "Google",
"url": "http://www.google.com"
},
{
"name": "Baidu",
"url": "http://www.baidu.com"
}
]
}
}
流程编排
流程说明
测试数据由组件
GenerateFlowFile
生成,且通过配置"自定义文本"参数的内容与上面输入数据相同的JSON数组数据。注意:切记将该组件“调度”下的“运行安排”设置大些,否则将瞬间生成大量测试数据。
- 附加参数提供由组件
UpdateAttribute
设置,且通过添加新的属性并设置值。
- 封装JSON数据由组件
JoltTransformJSON
来完成。
[
{
"operation": "shift",
"spec": {
"*": "data.links.[]"
}
},
{
"operation": "default",
"spec": {
"status": "${data.status}",
"message": "${data.message}",
"timestamp":"${data.timestamp}",
"data": {
"label": "${data.site.type}"
}
}
}
]
注意:
1、如果规范里设置多条规则,则需要将“DSL”中设置为“Chain”。
2、规范中的多条规则有的必须遵循先后顺序,比如此例中,由于输入数据为JSON数组,需先将数组转换(采用shift操作)为JSON对象,然后再插入字段(default操作)。
3、如果规范中的表达式变量有双引号,需提前转义,否则会导致Jolt封装失败。
实际输出数据
{
"data": {
"links": [
{
"name": "Google",
"url": "http://www.google.com"
},
{
"name": "Baidu",
"url": "http://www.baidu.com"
}
],
"label": "网站"
},
"message": "处理成功",
"timestamp": "2018-12-18 15:38:51.817",
"status": "success"
}
期望获得的输出数据尽管与期望的格式上不一致,但数据内容是保持一致,符合预期。
这是由于Jolt组件中“规范”设置中的先后顺序导致的。
流程模板
参见附件(请右键另存保存):Jolt数据封装模板
场景
比如场景:数据库查询记录封装成REST请求响应数据。通常从数据库查询的记录为多条,需将多条查询记录封装到一JSON对象的data字段后返回。