JOLT spec for permutaion

时间:2016-03-25 08:05:02

标签: javascript java json transformation jolt

请您帮我写下以下JOLT规范?

输入:

{
    "title": [
        "vsnu",
        "anothervsnu"
    ],
    "anothertitle": [
        "vsnu",
        "anothervsnu"
    ]
}

预期产出:

{
Response : [
{
"head" : "title",
"name" : "vsnu"
},
{
"head" : "title",
"name" : "anothervsnu"
},
{
"head" : "anothertitle",
"name" : "vsnu"
},
{
"head" : "anothertitle",
"name" : "anothervsnu"
}
]
}

过去3天我被困在这里。请帮帮我。 我希望上面的问题解释了期望,我写这篇文章只是因为StackOverflow显示了验证错误消息。

提前致谢。

2 个答案:

答案 0 :(得分:0)

您只需要两个迭代器,一个在输入的键上,另一个在属性的数组上。



function buildObject(o) {
    var result = [];

    Object.keys(o).forEach(function (k) {
        o[k].forEach(function (a) {
            result.push({ head: k, name: a });
        });
    });
    return { Response: result };
}

var input = { "title": ["vsnu", "anothervsnu"], "anothertitle": ["vsnu", "anothervsnu"] },
    output = buildObject(input);

document.write('<pre>' + JSON.stringify(output, 0, 4) + '</pre>');
&#13;
&#13;
&#13;

答案 1 :(得分:0)

由于Jolt“shift”一次处理一个项目,因此无法写入输出,即数组地图。

可以做到,但需要两班倒。第一个构建“head”和“name”的并行数组,第二个使用并行数组中的索引号将它们转换为Response数组。

规格

[
  {
    "operation": "shift",
    "spec": {
      "*": { // title or anothertitle
        "*": { // array index
          "*": { // actual array value "vsnu"
            "$2": "head[]", // for each array value grab a copy of the "title"
            "$": "name[]"
          }
        }
      }
    }
  },
  {
    "operation": "shift",
    "spec": {
      "head": {
        "*": "Response[&].head"
      },
      "name": {
        "*": "Response[&].name"
      }
    }
  }
]