如何通过JOLT根据photo/video属性名添加media_type字段?
JOLT规则补充:添加media_type字段
问题背景
现有两种JSON结构:
第一种JSON
[ { "type": "link", "link": { "url": "https://google.com", "photo": { "id": 457467865, "owner_id": 2000016837, "sizes": [ { "height": 89, "type": "a", "width": 200, "url": "https://sun9-41.userapi.com/LE7UgRqqunque4uSl2YxmK029tgImcFYHjpg" } ] }, "title": "Test" } } ]
第二种JSON
[ { "type": "link", "link": { "url": "amazon.com", "video": { "date": 1674803349, "duration": 30, "image": [ { "url": "https://i.mycdn.me/getVideoPreview?id=3679686756942&idx=0&type=39&tkn=bKnXfn=vid_s", "width": 130, "height": 96, "with_padding": 1 } ], "id": 456249970, "owner_id": -18098621 }, "title": "Test" } } ]
转换需求
- 提取两种JSON共有的
link.url和link.title字段; - 从
photo或video对象中提取id和owner_id,拼接为新字段media_id; - 根据属性名(
photo或video)添加新字段media_type。
以第二种JSON为例,期望转换结果:
{ "owner_id" : -18098621, "title" : "Test", "url" : "amazon.com", "media_id" : "-18098621_456249970", "media_type": "video" }
现有JOLT规则
[ { "operation": "shift", "spec": { "*": { "link": { "photo|video": { "id": "id", "owner_id": "owner_id" }, "title": "title", "url": "url" } } } }, { "operation": "modify-overwrite-beta", "spec": { "media_id": "=concat(@(1,owner_id),'_',@(1,id))" } } ]
需要补充规则实现media_type字段的添加。
解决方案
要获取media_type,需要在shift操作阶段捕获photo或video的属性名,具体调整如下:
修改第一个shift操作的规则,为photo和video分别设置映射,直接将属性名赋值给media_type,同时保留原有字段提取逻辑。完整JOLT规则如下:
[ { "operation": "shift", "spec": { "*": { "link": { "photo": { "@": { "id": "id", "owner_id": "owner_id" }, "#photo": "media_type" }, "video": { "@": { "id": "id", "owner_id": "owner_id" }, "#video": "media_type" }, "title": "title", "url": "url" } } } }, { "operation": "modify-overwrite-beta", "spec": { "media_id": "=concat(@(1,owner_id),'_',@(1,id))" } } ]
规则说明
- shift阶段:
- 拆分
photo|video的合并写法,分别处理两个节点; - 通过
#photo和#video直接为media_type赋值固定字符串,对应原属性名; - 用
@引用当前节点(photo或video对象),继续提取id和owner_id。
- 拆分
- modify阶段:保留原有拼接
media_id的逻辑不变。
验证效果
- 第一种JSON转换后结果:
{ "owner_id": 2000016837, "title": "Test", "url": "https://google.com", "media_id": "2000016837_457467865", "media_type": "photo" }
- 第二种JSON转换后结果与需求完全一致。
内容的提问来源于stack exchange,提问作者fujidaon
相关产品推荐
相关产品推荐

