1

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!

Community
  • 1
  • 1
shishh03
  • 57
  • 4
  • 14
  • Wouldn't you just need to add a `.A` to the end of your current print to get the `A` field? – squiguy Feb 06 '17 at 21:24
  • I tried doing that but it didn't work for some reason. Anyway, thanks for trying to help. The comment below has solved my problem. – shishh03 Feb 06 '17 at 21:30

1 Answers1

1

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).

Kaedys
  • 9,600
  • 1
  • 33
  • 40
  • I'm quite new to Go and the structs but this is great. It works. Thanks a lot! – shishh03 Feb 06 '17 at 21:28
  • What if A is an "interface{}" instead of an "int". My api call sometimes returns a null value and I need to be able to handle that response in the struct. I know how to store "J" float64 to a variable however, if J is null, I get an error. I changed J float64 to J interface{}. But not sure how to store the interface{} value to a variable – shishh03 Feb 11 '17 at 18:02
  • If `J` is an `interface{}`, you need to check it for nil, then type assert it to whatever type you what. Example: https://play.golang.org/p/inXq03UDUL – Kaedys Feb 13 '17 at 16:53