
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
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号