Может получить значение JSON в Go - PullRequest
0 голосов
/ 20 ноября 2018

Я новичок в го.Я пытаюсь прочитать файл JSON и получить его часть, а затем оперировать полученными значениями.Мой JSON находится в файле example.json:

{"results":[{"statement_id":0,"series":[{"name":"cpu/node_utilization","columns":["time","distinct"],"values":[[10,1],[11,3],[13,5]]}]}]}

Так что я хотел бы получить "значения" для получения суммы всех элементов.В этом случае: 1 + 3 + 5

Вот код, который у меня есть.Я могу получить результаты, но потом мне не удается получить серию.

Вот код, который у меня есть:

package main

import (
    "encoding/json"
    "fmt"
    "io/ioutil"
    "os"
)

func main() {
    // Open our jsonFile
    jsonFile, err := os.Open("example.json")
    // if we os.Open returns an error then handle it
    if err != nil {
        fmt.Println(err)
    }
    fmt.Println("Successfully Opened example.json")
    // defer the closing of our jsonFile so that we can parse it later on
    defer jsonFile.Close()

    byteValue, _ := ioutil.ReadAll(jsonFile)
    var all_data map[string]interface{}
    json.Unmarshal([]byte(byteValue), &all_data)
    fmt.Println(all_data["results"])
}

Я пробовал разные решения, такие какall_data["results"].(map[string]interface{})["series"]) Но проблема в том, что карта находится в массиве, и я не знаю, как ее решить.

Ответы [ 2 ]

0 голосов
/ 20 ноября 2018

Использование интерфейсов и карты

package main

import (
    "encoding/json"
    "fmt"
)

func main() {

    byteValue := []byte(`{"results":[{"statement_id":0,"series":[{"name":"cpu/node_utilization","columns":["time","distinct"],"values":[[10,1],[11,3],[13,5]]}]}]}`)

    var all_data map[string][]interface{}
    json.Unmarshal([]byte(byteValue), &all_data)
    fmt.Println("result:", all_data["results"])

    for _, r := range all_data["results"] {
        s := r.(map[string]interface{})
        fmt.Println("series:", s["series"])

        w := s["series"].([]interface{})
        for _, x := range w {
            y := x.(map[string]interface{})
            fmt.Println(y)

            z := y["values"].([]interface{})
            fmt.Println("values:", z)
            for _, v := range z {
                u := v.([]interface{})
                fmt.Println(u)
                for _, i := range u {
                    val := i.(float64)
                    fmt.Println(val)
                }
            }
        }
    }
}
0 голосов
/ 20 ноября 2018

Я решил определить структуру.

package main

import (
"encoding/json"
"fmt"
"io/ioutil"
"os"
)


type AutoGenerated struct {
    Results []struct {
        StatementID int `json:"statement_id"`
        Series      []struct {
            Name    string   `json:"name"`
            Columns []string `json:"columns"`
            Values  [][]int  `json:"values"`
        } `json:"series"`
    } `json:"results"`
}

func main() {
    // Open our jsonFile
jsonFile, err := os.Open("example.json")
// if we os.Open returns an error then handle it
if err != nil {
    fmt.Println(err)
}
fmt.Println("Successfully Opened example.json")
// defer the closing of our jsonFile so that we can parse it later on
defer jsonFile.Close()


byteValue, _ := ioutil.ReadAll(jsonFile)
all_data := AutoGenerated{}
json.Unmarshal([]byte(byteValue), &all_data)
fmt.Println(all_data.Results[0].Series[0].Values)
}

Я использовал этот web для автоматической генерации структуры, предоставляющей структуру JSON

...