我有一些以下格式的 JSON 数据:
{
// Other data...
"series": [
[1709120579, 23.12],
[1709120655, 24.69],
[1709120660, 25.01],
// etc..
],
// Other data...
}
我如何能够将此数据解析为这样的结构:
type DataPoint struct {
Timestamp int64
Value float64
}
type JsonData struct {
// other...
Series []DataPoint
// other...
}
但我找不到如何指定这一点,
这是我目前要测试的内容:
package main
import (
"encoding/json"
"fmt"
)
type DataPoint struct {
Timestamp int64
Value float64
}
type JsonData struct {
Data []DataPoint `json:"data"`
}
func main() {
jsonData := []byte(`{"data":[[132412,124.125],[3215124,23.123],[3214121224,21.42222]]}`)
var data JsonData
err := json.Unmarshal(jsonData, &data)
if err != nil {
fmt.Println("Error unmarshalling JSON:", err)
return
}
println(data.Data[0].Timestamp)
}
给我:
Error unmarshalling JSON: json: cannot unmarshal array into Go struct field JsonData.data of type main.DataPoint```
据我所知,可用语法不支持我在这里尝试执行的解码类型,因此解决方案是为需要特别注意的部分实现您自己的“解析器”。
这可以将需要自定义解析的部分分离到一个单独的结构中(在下面的示例中
DataPoint
),然后您可以为其实现UnmarshalJSON
函数。这允许您做的是解析当前的任意 JSON,然后使用该数据有选择地选择要分配给 DataPoint
结构的各个元素。
func (d *DataPoint) UnmarshalJSON(b []byte) error {
var records []json.RawMessage
if err := json.Unmarshal(b, &records); err != nil {
return err
}
if err := json.Unmarshal(records[0], &d.Timestamp); err != nil {
return err
}
if err := json.Unmarshal(records[1], &d.Value); err != nil {
return err
}
return nil
}
func main() {
jsonData := []byte(`{"data":[[132412,124.125],[3215124,23.123],[3214121224,21.42222]]}`)
var data JsonData
err := json.Unmarshal(jsonData, &data)
if err != nil {
fmt.Println("Error unmarshalling JSON:", err)
return
}
println(data.Data[0].Timestamp)
}
谢谢@Volker 和@Peter