首页 > Java > java教程 > 正文

Jolt 复杂场景下的 JSON 转换与数据类型处理

心靈之曲
发布: 2025-09-21 09:54:05
原创
348人浏览过

Jolt 复杂场景下的 JSON 转换与数据类型处理

本文深入探讨了如何使用 Jolt 对复杂 JSON 数据进行结构转换和数据类型处理。通过一个具体案例,详细介绍了 shift 操作在重塑数据结构、处理动态数组方面的应用,并着重讲解了 modify-overwrite-beta 操作结合 toString 函数实现数字类型到字符串类型转换的关键技术,旨在提供一套完整的 Jolt 转换解决方案。

1. Jolt 转换简介

jolt 是一种强大的 json 到 json 转换工具,它允许开发者通过定义一系列的“转换规范”(jolt spec)来重塑、过滤、修改 json 数据结构。在处理异构数据源或需要将数据适配到特定格式的场景中,jolt 提供了灵活且声明式的方法。

2. 复杂 JSON 结构转换挑战

在实际应用中,我们经常面临需要从复杂的嵌套 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"
    }
  ]
}
登录后复制

从上述输入和输出可以看出,核心需求包括:

  1. 将 Entity.card 中的字段重命名并归类到 tab 和 address 对象中。
  2. 处理 Entity.Photos 数组,将其中的 Id 映射为 no,Caption 映射为 caption2。
  3. 在 Photos 数组中,除了从 Entity.Photos 提取的数据外,还需要根据 card 部分的某些逻辑(此处为示例中的硬编码 Id1, Id2 等)生成额外的 Photos 条目。
  4. 最重要的是,将 Photos 数组中 no 字段的数值类型转换为字符串类型。

3. 逐步构建 Jolt Spec

我们将分两个主要步骤来构建 Jolt Spec:首先使用 shift 操作进行结构重塑和字段映射,然后使用 modify-overwrite-beta 操作进行数据类型转换。

3.1 步骤一:基础数据重塑 (Shift Operation)

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数组的结构正确
          }
        }
      }
    }
  }
]
登录后复制

解释:

Find JSON Path Online
Find JSON Path Online

Easily find JSON paths within JSON objects using our intuitive Json Path Finder

Find JSON Path Online30
查看详情 Find JSON Path Online
  • 第一个 shift 阶段:
    • "cardNo": "tab.text":将 Entity.card.cardNo 的值移动到 tab.text。
    • "cardAddress": "address[0].add":将 Entity.card.cardAddress 移动到 address 数组的第一个元素的 add 字段。[0] 表示创建一个单元素数组。
    • "cardC*": "address[0].mk":使用通配符 * 匹配 cardCity,将其值移动到 address[0].mk。
    • 硬编码部分 (Id1, #http.1.com 等):这些规则会创建额外的 Photos 数组元素。由于 Id1 和 Id2 在输入中不存在,Jolt 会根据其默认行为为 Photos.no 赋予一个默认值(例如,在某些 Jolt 版本或配置下可能是 0 或一个特定的数字,在我们的示例中为 222444)。#http.1.com 和 #http.2.com 是字面量,直接作为 Photos.caption2 的值。
    • "Photos": {"*": {"Id": "Photos.no", "Caption": "Photos.caption2"}}:这是处理动态 Photos 数组的关键。"*" 匹配数组中的每个对象。对于每个对象,Id 的值被移动到 Photos.no,Caption 的值被移动到 Photos.caption2。
  • 第二个 shift 阶段:
    • "tab": "&" 和 "address": "&":这些规则将前一个 shift 操作中生成的 tab 和 address 对象/数组提升到输出 JSON 的根级别。
    • "Photos": {"*": {"*": {"@": "&3[&1].&2"}}}:这一部分旨在确保 Photos 数组的结构正确。它将 Photos 数组中的每个元素的每个字段(@ 代表当前字段的值)移动到 Photos 数组中对应的位置。&3 指向 Photos 自身,&1 指向当前元素的索引,&2 指向当前字段的键。这个复杂的路径表达式确保了 Photos 数组中的每个对象保持其结构。

经过这两个 shift 操作后,输出的 JSON 结构已经基本符合要求,但 Photos 数组中的 no 字段仍然是数字类型。

3.2 步骤二:数据类型转换 (Modify Operation)

为了将 no 字段从数字类型转换为字符串类型,我们需要使用 modify-overwrite-beta 操作。modify 系列操作允许在不改变数据路径的情况下修改字段的值,例如进行类型转换、字符串拼接、数学运算等。

,
{
  "operation": "modify-overwrite-beta",
  "spec": {
    "Photos": {
      "*": {
        "no": "=toString" // 将 Photos 数组中每个元素的 "no" 字段值转换为字符串
      }
    }
  }
}
登录后复制

解释:

  • "operation": "modify-overwrite-beta":指定使用 modify-overwrite-beta 操作。这个操作会覆盖现有字段的值。
  • "Photos": {"*": {"no": "=toString"}}:
    • "Photos":定位到 Photos 数组。
    • "*":匹配 Photos 数组中的每一个元素(对象)。
    • "no":定位到每个元素中的 no 字段。
    • "=toString":这是一个 Jolt 内置的函数,它会将 no 字段的当前值转换为其字符串表示形式,并覆盖原始值。

4. 完整的 Jolt Spec 示例

将上述两个步骤的 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 字段的值都已成功转换为字符串类型。

5. 注意事项与最佳实践

  • *通配符 (`) 的使用:** 在处理动态数组或未知键名时,*` 通配符非常有用。它允许 Jolt 遍历集合中的所有元素或对象的所有字段。
  • Jolt 链式操作: Jolt Spec 是一个操作数组,每个操作都会在前一个操作的输出上执行。理解这种链式处理对于构建复杂的转换至关重要。
  • modify 操作家族: 除了 modify-overwrite-beta 和 toString,Jolt 的 modify 操作还提供了其他强大的函数,例如:
    • =toInteger: 转换为整数。
    • =toDouble: 转换为浮点数。
    • =toBoolean: 转换为布尔值。
    • =concat(field1, field2, ...): 字符串拼接。
    • =split(delimiter): 字符串分割。
    • =size: 获取数组或字符串的长度。
    • =now(): 获取当前时间戳。
    • 这些函数极大地扩展了 Jolt 在数据处理方面的能力。
  • 调试 Jolt Spec: 对于复杂的 Jolt Spec,建议分阶段进行测试。可以逐步添加操作,并检查每一步的输出,以确保转换逻辑正确。许多在线 Jolt Transform 调试器可以帮助可视化每一步的转换结果。
  • 路径匹配优先级: Jolt 在匹配输入路径时有特定的优先级规则。通常,更具体的路径模式会优先于更通用的通配符模式。

6. 总结

本教程详细展示了如何利用 Jolt 的 shift 和 modify-overwrite-beta 操作来解决复杂的 JSON 转换问题,特别是针对动态数组的处理和数据类型的精确转换。通过理解这些核心概念和实践技巧,开发者可以更有效地使用 Jolt 来满足各种数据集成和转换的需求。掌握 Jolt 不仅能提高数据处理效率,还能增强系统的灵活性和可维护性。

以上就是Jolt 复杂场景下的 JSON 转换与数据类型处理的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号