如何通过JOLT转换扁平化含嵌套JSON字符串的JSON对象
需求可行性分析与实现方案
首先要明确:你给出的目标JSON存在重复的ItemId键,这违反了JSON对象键必须唯一的语法规范,无法生成合法的JSON结构。需要先修正这个问题,比如把SourceData里的ItemId重命名为SourceItemId,修正后的目标结构如下:
{ "type" : "api.something, api.somethingElse", "Id" : "d1537a72-2e46-29c0-b119-2bac07857ka9", "ItemId" : "d1537a72-2e46-29c0-b119-2bac07869t8", "Amount" : 50, "Increased" : 10, "Type" : "increasment", "isIncreasment" : true, "SourceItemId" : "d1258672-3592-29c0-b119-2bac07857ka9", "testID" : 105, "ListId" : 18576, "Date": "2023-06-15T13:47:57.66" }
注:你提供的目标里ItemId值从原数据的d1537a72...变成了a1537a72...、Date从2023-06-12变成2023-06-15,如果是笔误则忽略,若是需要固定修改,会在JOLT规则里处理。
实现步骤与JOLT规则
使用JOLT的modify-overwrite-beta和shift操作组合完成转换:
1. 解析SourceData的JSON字符串
先把fromApi.SourceData这个JSON字符串解析成JSON对象,方便后续提取字段。
2. 扁平化所有字段并重命名指定键
将根节点的$type重命名为type,提取fromApi下的所有字段,再提取解析后的SourceData字段,同时处理重复键的重命名,以及日期的修改(如果需要)。
完整的JOLT规范如下:
[ { "operation": "modify-overwrite-beta", "spec": { "fromApi": { "SourceData": "=jsonParse(@(1,SourceData))" } } }, { "operation": "shift", "spec": { "$type": "type", "fromApi": { "Id": "Id", "ItemId": "ItemId", "Amount": "Amount", "Increased": "Increased", "Type": "Type", "SourceData": { "isIncreasment": "isIncreasment", "ItemId": "SourceItemId", "testID": "testID", "ListId": "ListId" }, // 如果需要固定修改日期,用下面的赋值;如果是笔误,直接用@(1,Date) "Date": { "#2023-06-15T13:47:57.66": "Date" } // 若日期不需要修改,替换成 "Date": "Date" } } } ]
规则说明
- modify-overwrite-beta:调用
jsonParse函数把SourceData的字符串转成JSON对象,这样才能提取里面的字段。 - shift:
- 把根节点的
$type映射到type; - 提取
fromApi下的常规字段; - 从解析后的
SourceData里提取字段,把原ItemId重命名为SourceItemId避免冲突; - 日期部分如果需要固定修改,用
#赋值固定字符串;如果只是笔误,直接映射原字段即可。
- 把根节点的
内容的提问来源于stack exchange,提问作者JassyJov
相关产品推荐
相关产品推荐

