如何使用Jolt处理JSON对象结构不一致时的属性提取
如何编写Jolt Transform处理结构不一致的JSON转换需求?
输入JSON
[ { "id": "65cf06b62fadc0122dc30f29", "code": "H34.23.9-240216-0003", "applicant": { "eformId": "60d990f88e6893001e5a7b42", "userId": "6186433deee4513fe0d86efc", "data": { "birthday": "", "address": "Thôn Kon Năng Treang", "gender": 2, "nation": { "label": "Việt Nam", "value": "5f39f4a95224cf235e134c5c" }, "ghiChu": "", "identityDate": "", "noiDung": "", "phoneNumber": "", "province": { "label": "Tỉnh Kon Tum", "value": "5def47c5f47614018c000062" }, "identityNumber": "062195002130", "soBoHoSo": "1", "organization": "Y Thảo", "district": { "label": "Huyện Đắk Hà", "value": "5def47c5f47614018c001615" }, "identityAgency": {}, "fullname": "Y Thảo", "fax": "", "village": { "label": "Xã Đắk Ui", "value": "5def47c5f47614018c123509" }, "email": "" } } }, { "id": "65cf24e3f21075472fe549c7", "code": "H34.6-240216-0032", "nationCode": "G22.99-240216-030023-H34", "applicant": { "eformId": "624bb547cdb7f7ec092bee16", "data": { "fullname": "CÔNG TY CỔ PHẦN VIEON", "province": { "label": "Thành phố Hồ Chí Minh", "value": "5def47c5f47614018c000079" }, "district": { "label": "Quận 3", "value": "5def47c5f47614018c001770" }, "village": { "label": "Phường Võ Thị Sáu", "value": "5def47c5f47614018c127139" }, "phoneNumber": "02838241919", "fax": "02838241919", "mail": "an.hoang@vieon.vn", "taxCode": "0314415573", "contact": "Hoàng Lê Huế An ", "contactPhoneNumber": "0385792805", "chonDoiTuong": 2, "hinhThucNop": 2, "ownerFullname": "CÔNG TY CỔ PHẦN VIEON", "identityNumber": "0314415573", "ownerIdentityNumber": "0314415573", "isOwnerDossier": true } } } ]
期望输出JSON
[ { "id": "65cf06b62fadc0122dc30f29", "eformId": "60d990f88e6893001e5a7b42", "gender": 2, "fullname": "Y Thảo", "ownerFullname": "", "province_label": "Tỉnh Kon Tum" }, { "id": "65cf24e3f21075472fe549c7", "eformId": "624bb547cdb7f7ec092bee16", "gender": null, "fullname": "CÔNG TY CỔ PHẦN VIEON", "ownerFullname": "CÔNG TY CỔ PHẦN VIEON", "province_label": "Thành phố Hồ Chí Minh" } ]
Jolt转换规范
[ { "operation": "shift", "spec": { "*": { "id": "[&1].id", "applicant": { "eformId": "[&2].eformId", "data": { "gender": "[&3].gender", "fullname": "[&3].fullname", "ownerFullname": "[&3].ownerFullname", "province": { "label": "[&4].province_label" } } } } } }, { "operation": "default", "spec": { "*": { "gender": null, "ownerFullname": "" } } } ]
转换说明
Shift操作:
- 遍历输入数组的每个元素(
*),提取顶层id到输出数组对应位置的id字段 - 提取
applicant.eformId到输出的eformId字段 - 从
applicant.data中提取gender、fullname、ownerFullname字段 - 将
applicant.data.province.label重命名为province_label并提取 &1、&2等是Jolt上下文索引,用来定位数组元素位置,保证字段映射到正确的输出对象
- 遍历输入数组的每个元素(
Default操作:
- 为数组中每个元素的缺失字段设置默认值:
gender默认设为null,ownerFullname默认设为空字符串 - 自动处理输入中不存在对应字段的情况,确保输出结构统一
- 为数组中每个元素的缺失字段设置默认值:
内容的提问来源于stack exchange,提问作者Duc Nguyen
相关产品推荐
相关产品推荐

