去解析json固定大小数组

问题描述 投票:0回答:1

我有一些以下格式的 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```
json go parsing
1个回答
2
投票

据我所知,可用语法不支持我在这里尝试执行的解码类型,因此解决方案是为需要特别注意的部分实现您自己的“解析器”。

这可以将需要自定义解析的部分分离到一个单独的结构中(在下面的示例中

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

© www.soinside.com 2019 - 2024. All rights reserved.