从 golang 的 echo 请求中提取 JSON
extract JSON from golang's echo request
我正在使用 Echo 在 Golang 中构建一个极简服务器。
在内部,Echo one 可以 bind an incoming JSON request payload to a struct 并访问有效负载。
但是我有一个场景,其中我只知道传入 JSON 请求负载的 3 个字段,并且绑定在这种情况下不起作用。
如何仍然访问我关心的 3 个字段?如果我不能在 Echo 中做到这一点,你能给我推荐一个与 Echo 的上下文结构一起工作的 JSON 解码器吗?
我对 Echo 不是最有经验的,但据我所知,绑定在这种情况下不起作用。 @elithar 在另一个线程中提供了对您的问题的一个很好的答案:
发件人:
你可以解码成一个map[string]interface{},然后通过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
结构通常是首选,因为它们对类型更明确。您只需声明您关心的 JSON 中的字段,而无需像使用映射那样键入断言值(encoding/json 隐式处理)。
您应该能够获取上下文的数据并以这种方式提取所需的字段。
我是这样做的:
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"]
使用 Golang 的 Echo 框架,您可以像这样从 JSON 中提取数据
样本Json
{
"username": "Super User",
"useremail": "super@user.email"
}
代码
import (
"github.com/labstack/echo"
)
func main() {
my_data := echo.Map{}
if err := echoCtx.Bind(&my_data); err != nil {
return err
} else {
username := fmt.Sprintf("%v", my_data["username"])
useremail := fmt.Sprintf("%v", my_data["useremail"])
}
}
我创建了一个自定义函数,它检索原始的 json 正文和 returns 如果在 returns 映射 [string] 接口{}
import (
"encoding/json"
"github.com/labstack/echo/v4"
"github.com/labstack/gommon/log"
)
func GetJSONRawBody(c echo.Context) map[string]interface{} {
jsonBody := make(map[string]interface{})
err := json.NewDecoder(c.Request().Body).Decode(&jsonBody)
if err != nil {
log.Error("empty json body")
return nil
}
return jsonBody
}
我正在使用 Echo 在 Golang 中构建一个极简服务器。
在内部,Echo one 可以 bind an incoming JSON request payload to a struct 并访问有效负载。
但是我有一个场景,其中我只知道传入 JSON 请求负载的 3 个字段,并且绑定在这种情况下不起作用。
如何仍然访问我关心的 3 个字段?如果我不能在 Echo 中做到这一点,你能给我推荐一个与 Echo 的上下文结构一起工作的 JSON 解码器吗?
我对 Echo 不是最有经验的,但据我所知,绑定在这种情况下不起作用。 @elithar 在另一个线程中提供了对您的问题的一个很好的答案:
发件人:
你可以解码成一个map[string]interface{},然后通过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
结构通常是首选,因为它们对类型更明确。您只需声明您关心的 JSON 中的字段,而无需像使用映射那样键入断言值(encoding/json 隐式处理)。
您应该能够获取上下文的数据并以这种方式提取所需的字段。
我是这样做的:
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"]
使用 Golang 的 Echo 框架,您可以像这样从 JSON 中提取数据
样本Json
{
"username": "Super User",
"useremail": "super@user.email"
}
代码
import (
"github.com/labstack/echo"
)
func main() {
my_data := echo.Map{}
if err := echoCtx.Bind(&my_data); err != nil {
return err
} else {
username := fmt.Sprintf("%v", my_data["username"])
useremail := fmt.Sprintf("%v", my_data["useremail"])
}
}
我创建了一个自定义函数,它检索原始的 json 正文和 returns 如果在 returns 映射 [string] 接口{}
import (
"encoding/json"
"github.com/labstack/echo/v4"
"github.com/labstack/gommon/log"
)
func GetJSONRawBody(c echo.Context) map[string]interface{} {
jsonBody := make(map[string]interface{})
err := json.NewDecoder(c.Request().Body).Decode(&jsonBody)
if err != nil {
log.Error("empty json body")
return nil
}
return jsonBody
}