Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

extract JSON from golang's echo request

Tags:

go

go-echo

I'm using Echo to build a minimalist server in Golang.

In, Echo one can bind an incoming JSON request payload to a struct internally and access the payload.

However I have a scenario wherein I know only 3 fields of the incoming JSON request payload, and the bind doesn't work in this case.

How do I still access the 3 fields that I care about ? If I cannot do this in Echo, can you recommend me a JSON decoder that works with Echo's context structure?

like image 990
7hacker Avatar asked Dec 31 '16 18:12

7hacker


2 Answers

This is how I did it:

json_map := make(map[string]interface{})
err := json.NewDecoder(c.Request().Body).Decode(&json_map)
if err != nil {
    return err
} else {
    //json_map has the JSON Payload decoded into a map
    cb_type := json_map["type"]
    challenge := json_map["challenge"]
like image 106
7hacker Avatar answered Oct 26 '22 10:10

7hacker


I'm not the most experienced with Echo, but to my knowledge the bind won't work in this case. @elithar provided what may be a good answer to your question in another thread:


From: Golang Json single value parsing

You can decode into a map[string]interface{} and then get the element by key.

data := make(map[string]interface{})
err := json.Unmarshal(content, &data)
if err != nil {
   return nil, err
}

price, ok := data["ask_price"].(string); !ok {
    // ask_price is not a string
    return nil, errors.New("wrong type")
}

// Use price as you wish

Structs are often preferred as they are more explicit about the type. You only have to declare the fields in the JSON you care about, and you don't need to type assert the values as you would with a map (encoding/json handles that implicitly).


You should be able to grab your context's data and extract the fields you want in this manner.

like image 38
Dan 0 Avatar answered Oct 26 '22 10:10

Dan 0