将对象 属性 转换为每个键一个元素的数组

Convert object property to array with one element per key

我正在尝试使用 Jolt 将对象转换为一个数组,原始对象中的每个键都有一个数组元素。我希望输出对象将原始键包含为 属性,并保留源值的所有属性。我需要为输入属性处理三种情况:

这是一个例子:

{
  "operations": {
    "foo": null,
    "bar": {},
    "baz": {
      "arbitrary": 1
    }
  }
}

以及所需的输出

{
  "operations": [
    {
      "operation": "foo"
    },
    {
      "operation": "bar"
    },
    {
      "operation": "baz",
      "arbitrary": 1
    }
  ]
}

Note: foo, bar and baz are arbitrary here. It needs to handle any property names inside the operations object.

这真的很接近我想要的:

[
  {
    "operation": "default",
    "spec": {
      "operations": {
        "*": {}
      }
    }
  },
  {
    "operation": "shift",
    "spec": {
      "operations": {
        "*": {
          "$": "operations[].operation"
        }
      }
    }
  }
]

但它从 baz 操作中删除 "arbitrary": 1

或者,这会保留操作中的属性,但不会为操作名称添加键:

[
  {
    "operation": "default",
    "spec": {
      "operations": {
        "*": {}
      }
    }
  },
  {
    "operation": "shift",
    "spec": {
      "operations": {
        "*": {
          "@": "operations[]"
        }
      }
    }
  }
]

如能提供这两种行为的任何帮助,我们将不胜感激。

您可以使用一级 shift 转换规范以及符号用法(通配符)而不是重复文字,例如

[
  {
    "operation": "shift",
    "spec": {
      "*s": {
        "*": {
          "$": "&2[#2].&(2,1)",
          "*": "&2[#2].&"
        }
      }
    }
  }
]

哪里

  • &2 表示通过遍历 { 符号向上 2 层树两次以选择密钥名称 operations(如果它只是 &->eg.identicals &(0) or &(0,0), 则只遍历冒号到达$进行抓取它的价值)

  • [#2]也代表走2层遍历{符号和: 标志,因为它已经位于 Rright Hand [=44=规范的]Side,为了询问到达的节点有多少匹配

  • &(2,1) subkey lookup 表示在树上向上移动 2 级并获取到达的键名对象的第一个参数,以及由 * 通配符分区的键的哪一部分由第二个参数使用。 (在这种情况下,我们生成没有复数后缀的文字operation

  • * 通配符,总是在 Left HSide,表示其余属性(else case).

站点 http://jolt-demo.appspot.com 上的 演示