2

I'm a total noob at go and I'm trying to understand what I'm missing here. I'm expecting to use dec.Decode to loop over the json values and end up with a map of the response. What I'm getting is the entire json string as the key to the first element of the map. What am I missing?

Example response:

2015/03/02 10:03:16 map[error:invalid_request error_description:that is not a recognized WePay API call error_code:1001] map[string]interface {}

package main

import (
    "encoding/json"
    "io"
    "log"
    "net/http"
    "reflect"
)

func main() {
    var v map[string]interface{}
    resp, err := http.Get("https://wepayapi.com/v2/")
    if err != nil {
        log.Println("Error: " + err.Error())
    }   
    defer resp.Body.Close()

    // resp.Body is an io.ReadCloser... NewDecoder expects an io.Reader
    dec := json.NewDecoder(resp.Body)

    // Decode reads the next JSON-encoded value from its input and stores it in the value pointed to by v.
    for err := dec.Decode(&v); err != nil && err != io.EOF; {
        log.Println("ERROR: " + err.Error())
        return
    }   
    log.Println(v, reflect.TypeOf(v))
}
3
  • Can you show us a sample, or the structure of the json returned? Commented Mar 2, 2015 at 16:29
  • From what I see, you clearly have a map with three keys, error, error_description and error_code. Just print len(v) or v["error_code"]. Commented Mar 2, 2015 at 16:31
  • It was decoding the JSON correctly all long. I was reading the log line as essentially map["error_description:that is not a recognized WePay API call error_code:1001 error:invalid_request"] (the key as the entire JSON string) instead of it being a map with these 3 values. Bottom line I'm an idiot ;) Commented Mar 2, 2015 at 16:45

1 Answer 1

2

Decoder will decode the whole JSON value at once (in this case the error object), you don;y have to call it in a loop:

if err := dec.Decode(&v); err != nil {
    log.Println("ERROR: " + err.Error())
    return
}

As a response you get a map equavalent of this JSON:

{"error":"invalid_request","error_description":"that is not a recognized WePay API call","error_code":1001}

Result:

map[string]interface{} {
    "error":"invalid_request",
    "error_description":"that is not a recognized WePay API call",
    "error_code":1001,
}
Sign up to request clarification or add additional context in comments.

2 Comments

How to retrieve individual values from this interface?
@VinitGaikwad result["error"].(string) and similar for the others

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.