10

我正在使用Echo在 Golang 中构建一个极简服务器。

在其中,Echo one 可以将传入的 JSON 请求负载绑定到内部结构并访问负载。

但是,我有一个场景,其中我只知道传入 JSON 请求有效负载的 3 个字段,并且在这种情况下绑定不起作用。

我如何仍然访问我关心的 3 个字段?如果我不能在 Echo 中做到这一点,你能推荐我一个与 Echo 的上下文结构一起工作的 JSON 解码器吗?

4

4 回答 4

12

我是这样做的:

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"]
于 2016-12-31T23:33:14.600 回答
2

我不是 Echo 最有经验的人,但据我所知,绑定在这种情况下不起作用。@elitha 在另一个线程中提供了对您的问题的一个很好的答案:


来自:Golang Json 单值解析

您可以解码为 map[string]interface{},然后按键获取元素。

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 中声明字段,并且不需要像使用映射那样键入断言值(隐式编码/json 处理)。


您应该能够以这种方式获取上下文数据并提取所需的字段。

于 2016-12-31T18:45:24.433 回答
1

我创建了一个自定义函数,它检索原始 json 正文并返回 nil,如果不存在任何值,则返回 map[string]interface{}

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
}
于 2021-02-06T03:34:33.873 回答
0

使用 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"])
    }
}
于 2021-02-03T12:20:15.717 回答