
jolt 是一种强大的 json 到 json 转换工具,它允许开发者通过定义一系列的“转换规范”(jolt spec)来重塑、过滤、修改 json 数据结构。在处理异构数据源或需要将数据适配到特定格式的场景中,jolt 提供了灵活且声明式的方法。
在实际应用中,我们经常面临需要从复杂的嵌套 JSON 结构中提取特定信息,并将其重塑为另一种格式的挑战。本教程将以一个具体的案例为例,展示如何处理包含动态数组、需要字段重命名和数据类型转换的场景。
原始输入 JSON 示例:
{
"Entity": {
"card": {
"cardNo": "123456789",
"cardStatus": "10",
"cardAddress": "UK",
"cardAddress1": "US",
"cardCity": "mk",
"name": "RAM",
"lastName": "ABU",
"name1": "RAM1",
"lastName1": "ABU1"
},
"Photos": [
{
"Id": 327703,
"Caption": "TEST>> photo 1",
"Url": "http://bob.com/0001/327703/photo.jpg"
},
{
"Id": 327704,
"Caption": "TEST>> photo 2",
"Url": "http://bob.com/0001/327704/photo.jpg"
},
{
"Id": 327704,
"Caption": "TEST>> photo 2",
"Url": "http://bob.com/0001/327704/photo.jpg"
}
]
}
}期望输出 JSON 示例:
{
"tab": {
"text": "123456789"
},
"address": [
{
"add": "UK",
"add2": "US",
"mk": "mk"
}
],
"Photos": [
{
"caption2": "http.1.com",
"no": "222444"
},
{
"caption2": "http.2.com",
"no": "222444"
},
{
"caption2": "TEST>> photo 1",
"no": "327703"
},
{
"caption2": "TEST>> photo 2",
"no": "327704"
},
{
"caption2": "TEST>> photo 2",
"no": "327704"
}
]
}从上述输入和输出可以看出,核心需求包括:
我们将分两个主要步骤来构建 Jolt Spec:首先使用 shift 操作进行结构重塑和字段映射,然后使用 modify-overwrite-beta 操作进行数据类型转换。
shift 操作是 Jolt 中最常用的操作之一,用于将输入 JSON 中的值移动到输出 JSON 的新路径。它通过键值对的方式定义映射规则,其中键是输入路径模式,值是输出路径模式。
[
{
"operation": "shift",
"spec": {
"Entity": {
"card": {
"cardNo": "tab.text",
"cardAddress": "address[0].add",
"cardAddress1": "address[0].add2",
"cardC*": "address[0].mk",
// 以下是示例中用于生成额外Photos条目的硬编码逻辑
"Id1": "Photos.no",
"#http.1.com": "Photos.caption2",
"Id2": "Photos.no",
"#http.2.com": "Photos.caption2"
},
"Photos": {
"*": { // 使用通配符 * 处理动态数组中的每个元素
"Id": "Photos.no",
"Caption": "Photos.caption2"
}
}
}
}
},
{
"operation": "shift",
"spec": {
"tab": "&", // 将 "tab" 对象提升到根级别
"address": "&", // 将 "address" 数组提升到根级别
"Photos": {
"*": {
"*": {
"@": "&3[&1].&2" // 这是一个相对复杂的路径重组,确保Photos数组的结构正确
}
}
}
}
}
]解释:
Easily find JSON paths within JSON objects using our intuitive Json Path Finder
30
经过这两个 shift 操作后,输出的 JSON 结构已经基本符合要求,但 Photos 数组中的 no 字段仍然是数字类型。
为了将 no 字段从数字类型转换为字符串类型,我们需要使用 modify-overwrite-beta 操作。modify 系列操作允许在不改变数据路径的情况下修改字段的值,例如进行类型转换、字符串拼接、数学运算等。
,
{
"operation": "modify-overwrite-beta",
"spec": {
"Photos": {
"*": {
"no": "=toString" // 将 Photos 数组中每个元素的 "no" 字段值转换为字符串
}
}
}
}解释:
将上述两个步骤的 Jolt Spec 组合起来,形成一个完整的转换链。Jolt 转换是按顺序执行的,因此 shift 操作完成后,modify 操作会在 shift 的输出结果上执行。
[
{
"operation": "shift",
"spec": {
"Entity": {
"card": {
"cardNo": "tab.text",
"cardAddress": "address[0].add",
"cardAddress1": "address[0].add2",
"cardC*": "address[0].mk",
"Id1": "Photos.no",
"#http.1.com": "Photos.caption2",
"Id2": "Photos.no",
"#http.2.com": "Photos.caption2"
},
"Photos": {
"*": {
"Id": "Photos.no",
"Caption": "Photos.caption2"
}
}
}
}
},
{
"operation": "shift",
"spec": {
"tab": "&",
"address": "&",
"Photos": {
"*": {
"*": {
"@": "&3[&1].&2"
}
}
}
}
},
{
"operation": "modify-overwrite-beta",
"spec": {
"Photos": {
"*": {
"no": "=toString"
}
}
}
}
]使用这个完整的 Jolt Spec 对原始输入 JSON 进行转换,将得到完全符合期望的输出 JSON,其中 Photos 数组中所有 no 字段的值都已成功转换为字符串类型。
本教程详细展示了如何利用 Jolt 的 shift 和 modify-overwrite-beta 操作来解决复杂的 JSON 转换问题,特别是针对动态数组的处理和数据类型的精确转换。通过理解这些核心概念和实践技巧,开发者可以更有效地使用 Jolt 来满足各种数据集成和转换的需求。掌握 Jolt 不仅能提高数据处理效率,还能增强系统的灵活性和可维护性。
以上就是Jolt 复杂场景下的 JSON 转换与数据类型处理的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号