簡體   English   中英

JSONata,如何將單個元素轉換為嵌套的 arrays?

[英]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]} )][]
        ]
    }
]

https://try.jsonata.org/kaXX2dhyb

您可以在$.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM