如何将 jsonata 用于 return 多个对象,分配第一个 key/value,它始终是 dateTime,其余键各不相同

How to use jsonata to return multiple objects, distributing the first key/value, which will always be dateTime, with the remaining keys varying

如何使用jsonata进行改造:

{
  "data": [
    {
      "dateTime": "2019-10-19T12:53:54.043Z",
      "Reactor3.Level": 1.51860072870498,
      "Reactor3.Temp": 27.1360543141452
    },
    {
      "dateTime": "2019-10-19T12:55:54.043Z",
      "Reactor3.Press": 88.9,
      "Reactor3.Temp": 24.1418981047159
    }
  ]
}

转化为只包含{"dateTime"两个键的一系列对象:"2019-10-19T12:53:54.043Z", key[1]:value[1]},{"dateTime":"2019-10-19T12:53:54.043Z",key[2]:value[2]} 比如下面的:

{
  "data": [
    {
      "dateTime": "2019-10-19T12:53:54.043Z",
      "Reactor3.Level": 1.51860072870498
    },
    {
      "dateTime": "2019-10-19T12:53:54.043Z",
      "Reactor3.Temp": 27.1360543141452
    },
    {
      "dateTime": "2019-10-19T12:55:54.043Z",
      "Reactor3.Press": 88.9
    },
    {
      "dateTime": "2019-10-19T12:55:54.043Z",
      "Reactor3.Temp": 24.1418981047159
    }
  ]
}

第一个键始终是 dateTime,其他键会有所不同,我想按 dateTime 拆分所有其他 keys/values? 这里 Reactor3.Level、Reactor3.Temp、Reactor3.Press 只是会改变的例子。

编辑:在下文中,我将添加一个更通用的问题版本。 我本质上是在寻找一个 JSONata 查询来转换这个输入:

{
  "data": [
    {
      "TS": "TS1",
      "V1": 1,
      "V2": 2
    },
    {
      "TS": "TS2",
      "V2": 9,
      "V3": 8,
      "V4": 7
    }
  ]
}

其中键 "TS" 是每组中的第一个键, 其他键会有所不同。 并将其转换为以下输出:

{
  "data": [
    {
      "TS": "TS1",
      "V1": 1
    },
    {
      "TS": "TS1",
      "V2": 2
    },
    {
      "TS": "TS2",
      "V2": 9
    },
    {
      "TS": "TS2",
      "V3": 8
    },
    {
      "TS": "TS2",
      "V4": 7
    }
  ]
}

[已解决] SteveR 在下面解决了我的问题,我只想在此处添加一个 Node-RED "payload" 友好版本的解决方案: Link: http://try.jsonata.org/HJCjoHxoS

负载修改JSONata:

payload.$ ~> | $ | { "data": data.(
    $obj := $;
    $key := "dateTime";
    $keys($obj)[$ != $key].{
        $key : $lookup($obj, $key),
        $: $lookup($obj, $)
    }
) } |

再次感谢@SteveR

有趣的挑战,Jeff -- 但如果对象属性没有保证顺序,则可能无法可靠地执行...是 总是 "first" 属性 需要分配给其余的人,或者您可以肯定地说它将始终被称为 TS (使用您的简化示例)?

也就是说,我确实找到了一个似乎有效的表达式,尽管只是在我有限的测试中:

data.(
    $obj := $;
    $keys($obj)[[1..100]].(
        $key := $keys($obj)[0];
        {
            $key : $lookup($obj, $key),
            $: $lookup($obj, $)
        }
    )
)

本质上,对于每个传入的对象,获取其键——对于索引在 1 - 100 之间的每个键(我知道,这是一个人为限制),创建新对象 { key[0]: val[0], key[i]: val[i] }

如果您愿意,可以尝试在此处进行调整=> http://try.jsonata.org/ryh3hqM5H

如果你可以肯定地说第一个属性叫做"TS",我会用那个叫属性来简化表达式,像这样:

data.(
    $obj := $;
    $key := "TS";
    $keys($obj)[$ != $key].{
        $key : $lookup($obj, $key),
        $: $lookup($obj, $)
    }
)

我确信有更好的方法可以完成相同的转换,但我希望这对您有所帮助...

祝你好运!

编辑:我发现我丢失了外部对象及其 data 属性。您可以将它包裹在我列出的表达式周围,或者如果还有其他需要维护的属性,请使用对象转换语法仅修改那个 data 属性:

$$ ~> | $ | { "data": data.(
    $obj := $;
    $key := "dateTime";
    $keys($obj)[$ != $key].{
        $key : $lookup($obj, $key),
        $: $lookup($obj, $)
    }
) } |