如何将 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, $)
}
) } |
如何使用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, $)
}
) } |