Skip to main content

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字段后返回。