json - 如果某些值的“字段/键”变化或未知,则在定义JSON数据的结构时应使用什么Go标签?

标签 json go struct marshalling unmarshalling

在尝试解析时间序列数据时,我发现JSON数据中的关键字段是时间戳(显然是字符串格式)。但是无法为相同的对象事先创建结构,因为无论如何我都不知道时间戳字符串。

JSON如下所示:

"Time Series (5min)": {
        "2020-01-17 16:00:00": {
            "1. open": "167.2000",
            "2. high": "167.3400",
            "3. low": "167.0100",
            "4. close": "167.0500",
            "5. volume": "1646699"
        },
        "2020-01-17 15:55:00": {
            "1. open": "166.9000",
            "2. high": "167.1600",
            "3. low": "166.8500",
            "4. close": "167.1500",
            "5. volume": "622999"
        },
        "2020-01-17 15:50:00": {
            "1. open": "166.7241",
            "2. high": "166.9200",
            "3. low": "166.7200",
            "4. close": "166.8999",
            "5. volume": "271723"
        }
    }

其中一些的结构可能类似于:

type TIMESTAMP struct {
    Open   string `json:"1. open"`
    High   string `json:"2. high"`
    Low    string `json:"3. low"`
    Close  string `json:"4. close"`
    Volumn string `json:"5. volumn"`
}

type TIMESERIES struct {
    TimeStamp TIMESTAMP `json:""`  //DON'T KNOW HOW TO IMPLEMENT THIS
}

如何处理这种情况?是否有相同的Go struct标签?

最佳答案

2020-01-17 16:00:00这样的键似乎是动态生成的,并且不是固定的,因此您可以将map用作此类任意键

package main

import (
    "fmt"
    "encoding/json"
)

type TIMESTAMP struct {
    Open   string `json:"1. open"`
    High   string `json:"2. high"`
    Low    string `json:"3. low"`
    Close  string `json:"4. close"`
    Volumn string `json:"5. volumn"`
}


type TIMESERIES map[string]map[string]TIMESTAMP

func main() {
    test := []byte(`{
    "Time Series (5min)": {
        "2020-01-17 16:00:00": {
            "1. open": "167.2000",
            "2. high": "167.3400",
            "3. low": "167.0100",
            "4. close": "167.0500",
            "5. volume": "1646699"
        },
        "2020-01-17 15:55:00": {
            "1. open": "166.9000",
            "2. high": "167.1600",
            "3. low": "166.8500",
            "4. close": "167.1500",
            "5. volume": "622999"
        },
        "2020-01-17 15:50:00": {
            "1. open": "166.7241",
            "2. high": "166.9200",
            "3. low": "166.7200",
            "4. close": "166.8999",
            "5. volume": "271723"
         }
       }
    }`)
    var response TIMESERIES
    if err := json.Unmarshal(test, &response); err != nil {
        fmt.Println(err)
        return
    }

    fmt.Printf("%+v", response)
}

关于json - 如果某些值的“字段/键”变化或未知,则在定义JSON数据的结构时应使用什么Go标签?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59840615/

相关文章:

C 编程为什么我的代码不能使用嵌套结构数组打印正确的输出?

arrays - 我在 Golang 中使用循环创建数组数组时遇到问题

windows - 为什么无法使用任何端口连接到 127.0.0.1 上的 http 服务绑定(bind)

javascript - 自定义 Ember.js DS.RESTSerializer 的根元素

json - Hive:json SerDe 文件在外部表中返回 "NULL"

http - 如何在请求中转义正斜杠以使 url-routers 将其计为 uri 参数的一部分?

C++ 如何将值从一种结构传递到另一种结构?

c# - 有一个循环来创建结构

java - 我需要从 JSON 对象中删除特定标签

javascript - 如何通过 HTML 将带有单引号的 JSON 从 PHP 传递到 Javascript?