Какой тег Go следует использовать при определении структуры данных JSON, если «поле / ключ» для некоторых значений меняется или не известно? - PullRequest
0 голосов
/ 21 января 2020

При попытке анализа данных временного ряда я обнаружил, что ключевое поле в данных 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 тег структуры для того же самого?

1 Ответ

6 голосов
/ 21 января 2020

Ключи, подобные 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)
}

...