问题描述
我正在将两个对象数组转换为一个对象数组。这样做时,根据 item 的类型,我需要为每个 item 分配一个 id。并且,将项目放入单个数组后,id 应该是串行的,按照它们最初出现在输入 json 中的顺序。它不是所有项目的单个 itemId。它基于它自己的类型。 PFB 输入和输出 JSON 样本。使用 jolt-core [0.1.0] 。请帮忙。
输入JSON:
{
"Beverages" : {
"Items" : [ {
"name" : "cofee","type" : "hot"
},{
"name" : "wine","type" : "cold"
},{
"name" : "tea",{
"name" : "beer","type" : "cold"
}
]
},"Snacks" : {
"Items" : [ {
"name" : "crackers",{
"name" : "salad",{
"name" : "muffin",{
"name" : "toast","type" : "hot"
}
]
}
}
而且,预期的输出是:
{
"items" : [{
"name" : "cofee","type" : "hot","hotId" : 1
},"type" : "cold","coldId" : 1
},"hotId" : 2
},"coldId" : 2
},{
"name" : "crackers","hotId" : 3
},"coldId" : 3
},"coldId" : 4
},"hotId" : 4
}
]
}
如上,hotId 和coldId 是输出中的新字段。但是,它会增加。
解决方法
这个(冗长的)规范应该产生输出
[
{
"operation": "shift","spec": {
"*": {
"Items": {
"*": {
"name": "@(1,type)"
}
}
}
}
},{
"operation": "shift","spec": {
"*": {
"*": "&1[&0].name"
}
}
},"spec": {
"*": {
"*": {
"*": "&2[&1].&","$1": "&2[&1].type"
}
}
}
},{
"operation": "modify-default-beta","spec": {
"*": {
"*": {
"idName": "=concat(@(1,type),'Id')"
}
}
}
},"spec": {
"*": {
"@": "&","*": {
"idName": {
"$1": "&3[&2].idValue"
}
}
}
}
},{
"operation": "modify-overwrite-beta","spec": {
"*": {
"*": {
"idValue": "=intSum(@(1,idValue),1)"
}
}
}
},"spec": {
"*": {
"*": {
"idValue": "&2[&1].@(1,idName)"
},"@": "&"
}
}
},"spec": {
"*": {
"*": {
"name|type|coldId|hotId": "&2[&1].&"
}
}
}
},"spec": {
"*": {
"*": "items[]"
}
}
}
]
尝试一个接一个地检查转换的输出。 注意:元素的顺序与所需的输出不同。如果我找到更多时间,我会尝试对其进行排序并(也许)使其更简洁。