[英]JSONata, how to transform single elements into nested arrays?
我正在嘗試將查詢結果轉換為正確的形式以顯示在節點紅色的圖表中。
數據來自對象數組results
,每個 object 包含一個時間序列的詳細信息。
為了使圖表一起顯示所有系列,需要將數據轉換為“arrays 對象數組(實際 x/y 點)”。
如果源 JSON 包含多個時間序列,我可以做到這一點,但如果只有一個它會失敗。
工作示例如下所示,而數組results
可以包含 n 個(介於 0 和 N 之間)元素。 (參見 JSONata 練習器 https://try.jsonata.org/2GqaqME4F中 n=2 的示例)
{
"payload": {
"results": [
{
"statement_id": 0,
"series": [
{
"name": "table1",
"columns": [
"time",
"temperature 1"
],
"values": [
[
"2022-08-18T14:55:00Z",
1.1
],
[
"2022-08-18T15:00:00Z",
1.2
]
]
}
]
},
{
"statement_id": 1,
"series": [
{
"name": "table1",
"columns": [
"time",
"temperature 2"
],
"values": [
[
"2022-08-18T14:55:00Z",
2.1
],
[
"2022-08-18T15:00:00Z",
2.2
]
]
}
]
}
]
}
}
我現在正在用這個 JSONata 轉換數據
[
{
"series": [ $.payload.results.($.series.columns[1]) ],
"labels": [ $.payload.results.("") ],
"data": [
$.payload.results.[series.values.( $[1] != null ? {"x": $[0].$toMillis(),"y": $[1]} )]
]
}
]
它給了我 n>1 的預期結果:
[
{
"series": [
"temperature 1",
"temperature 2"
],
"labels": [
"",
""
],
"data": [
[
{
"x": 1660834500000,
"y": 1.1
},
{
"x": 1660834800000,
"y": 1.2
}
],
[
{
"x": 1660834500000,
"y": 2.1
},
{
"x": 1660834800000,
"y": 2.2
}
]
]
}
]
要使圖表一起顯示所有系列,重要的是data
是“對象的 arrays 數組(實際 x/y 點)”。
對於 n=1(參見 JSONata 練習器 https://try.jsonata.org/F0prxQW4o中的 n=1)
{
"payload": {
"results": [
{
"statement_id": 0,
"series": [
{
"name": "table1",
"columns": [
"time",
"temperature 1"
],
"values": [
[
"2022-08-18T14:55:00Z",
1.1
],
[
"2022-08-18T15:00:00Z",
1.2
]
]
}
]
}
]
}
}
結果是
[
{
"series": [
"temperature 1"
],
"labels": [
""
],
"data": [
{
"x": 1660834500000,
"y": 1.1
},
{
"x": 1660834800000,
"y": 1.2
}
]
}
]
它不再是“對象數組 arrays”,而是“對象數組”。
結果應該是
[
{
"series": [
"temperature 1"
],
"labels": [
""
],
"data": [
[ //<--- This parenthesis is missing
{
"x": 1660834500000,
"y": 1.1
},
{
"x": 1660834800000,
"y": 1.2
}
] //<--- This parenthesis is missing
]
}
]
有人能告訴我 JSONata 看起來如何適用於 0 和 N 之間的所有 n 嗎?
您可以使用此處所述的空方括號運算符[]
將 singleton 序列強制為 output 作為數組。 你的表達是:
[
{
"series": [ $.payload.results.($.series.columns[1]) ],
"labels": [ $.payload.results.("") ],
"data": [
$.payload.results.[series.values.( $[1] != null ? {"x": $[0].$toMillis(),"y": $[1]} )][]
]
}
]
您可以在$.payload.results
之后添加[]
以強制 JSONata“保留數組”(請參閱此處有關此行為的文檔: https://docs.jsonata.org/predicate#singleton-array-and-value-equivalence ) .
這是修改后的解決方案: https://stedi.link/1625Zpj
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.