shishh03 shishh03 - 4 years ago 359
JSON Question

how to parse structs in golang and print the items from the struct?

Here is a similar example: Parsing JSON in GoLang into struct
I am getting a json response from the server and I only need to get certain data.
I've created a sample code:

package main

import (
"fmt"
"encoding/json"
)

type response struct {
Response []struct {
Stats struct {
A int `json:"a"`
B float64 `json:"b"`
C int `json:"c"`
D float64 `json:"d"`
E float64 `json:"e"`
F float64 `json:"f"`
G float64 `json:"g"`
H float64 `json:"h"`
I float64 `json:"i"`
J float64 `json:"j"`
} `json:"stats"`
Data []struct {
Num0 int64 `json:"0"`
Num1 interface{} `json:"1"`
} `json:"data"`
} `json:"response"`
}


func main() {
src := `
{
"response": [{
"stats": {
"a": 458,
"b": 302.3738,
"c": 0,
"d": 706.777,
"e": 2.423,
"f": 238.73375,
"g": 68.971,
"h": 85.1989781659389,
"i": 84.6381777592766,
"j": 292658.49
},
"data": [
[1453222860000, null],
[1453223160000, 3.769],
[1453223220000, 37.464]
]
}
]
}
`

var g response
json.Unmarshal([]byte(src), &g)
fmt.Println(g.Response[0].Stats)
}


The output I get is

`{458 302.3738 0 706.777 2.423 238.73375 68.971 85.1989781659389 84.6381777592766 292658.49}


`

I want to get certain items from just the stat struct. Let's say I want to print the value of A or J from the stats struct. How do I do that?
I don't really need the data struct. The json response I got from the server gave me those data but I dont really need it. Anyway, my question is how do I get only certain items only in the Stats struct?

Any suggestion on how to do this or even improve my structs format?
Thanks!

Answer Source

You can simply omit any piece of the structure you don't care about. The JSON package will silently ignore anything present in the source JSON that isn't present in the destination structure. Thus if you don't care about the Data portion, omit it from the structure. If you only care about A and J in the stats section, only include those.

type response struct {
    Response []struct {
        Stats struct {
            A int `json:"a"`
            J float64 `json:"j"`
        } `json:"stats"`
    } `json:"response"`
}

https://play.golang.org/p/W3bmlf15sF

Edit: Also worth noting that you don't need to include the struct tags if they are just lowercases of the field names, as the JSON package will match fields that only differ by capitalization (though it prefers exact matches, if there's ambiguity).

Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download