0

i have the following json array of json hashes :

[
  {
    "name": "XXXX",
    "address": "XXXX",
    "keepalive": {
      "thresholds": {
        "warning": 30,
        "critical": 100
      },
      "handlers": [
        "XXXXX"
      ],
      "refresh": 180
    },
    "subscriptions": [
      "XXXX",
      "XXXX",
      "XXXX"
    ],
    "version": "0.17.1",
    "timestamp": 1486413490
  },
  {...}, 
  {...},
...
]

And am parsing the array as the following :

type Client struct {
    Name string `json:"name"`
    Address string `json:"address"`
    PublicDNS string `json:"publicDNS"`
    keepalive [] string `json:"keepalive"`
    Subscriptions [] string `json:"subscriptions"`
    Version string `json:"version"`
    Timestamp int64 `json:"timestamp"`
}

type ClientResponse []Client


func getClients(body []byte) (*ClientResponse, error) {
    var s = new(ClientResponse)
    err := json.Unmarshal(body, &s)
    if(err != nil){
        fmt.Println("whoops:", err)
    }
    return s, err
}


func main() {
    res,err := http.Get("http://xxxxx:4567/clients")
    if err != nil{
        panic(err.Error())
    }

    body,err := ioutil.ReadAll(res.Body)
    if err != nil{
        panic(err.Error())
    }
    s, err := getClients([]byte(body))  
    fmt.Println(s)
}

Problem : variable s , contain all arrays . so how can i get lets say name value for all arrays ? should i do for loop and get values i need ? is this the best approach ?

1 Answer 1

1

You'll have to loop over them.

names := make([]string, len(*s))
for i := range *s {
    names[i] = (*s)[i].Name
}

Incidentally, your structure for unmarshalling is incorrect. keepalive isn't exported, so it won't be unmarshalled, and even if it were, it's defined as a slice of strings, while the keepalive field in the JSON is an object with thresholds, handlers, and refresh fields

Sign up to request clarification or add additional context in comments.

4 Comments

cannot range over s (type *ClientResponse)
Ahhh, you made a named type of the slice. Should be able to range over *s, though. Incidentally, pointers to slices are almost never useful, since slices themselves are just 3-word structures, so you're only saving 2 words of data in exchange for an additional layer of indirection.
seems ok now , thanks .. what is the best approach for such arrays ? i mean you are saying "pointers to slices are almost never useful" i did that because i was getting error : cannot unmarshal array into Go value of type main.Client
Don't unmarshal it into a Client, unmarshal it directly into a slice []Client. Example: play.golang.org/p/-e6ypRch1N

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.