Извлечь JSON из эхо-запроса Голанга

Я использую Echo для создания минималистского сервера на Голанге.

В Echo можно связать полезную нагрузку входящего JSON-запроса со структурой внутри и получить доступ к полезной нагрузке.

Однако у меня есть сценарий, в котором я знаю только 3 поля входящей полезной нагрузки JSON-запроса, и в этом случае привязка не работает.

Как мне получить доступ к трем интересующим меня полям? Если я не могу сделать это в Echo, можете ли вы порекомендовать мне JSON-декодер, который работает со структурой контекста Echo?

5 ответов

Решение

Вот как я это сделал:

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"]

Я создал пользовательскую функцию, которая извлекает необработанное тело json и возвращает nil, если в противном случае нет значений, возвращающих карту[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
}

Я не самый опытный с Echo, но, насколько мне известно, привязка не сработает в этом случае. @elithar дал хороший ответ на ваш вопрос в другой ветке:


От: 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, о котором вы заботитесь, и вам не нужно вводить значения, как если бы это было с картой (encoding/json обрабатывает это неявно).


Вы должны быть в состоянии получить данные вашего контекста и извлечь нужные поля таким образом.

вот простое решение

      func UnwantedJSONHandler(c echo.Context){
    b, _ := io.ReadAll(c.Request().Body)
    var r RequestDataAssumedStruct
    if err := json.Unmarshal(b, &r); err != nil {
        log.Println(err.Error())
        return err
    }
    log.Println(r)
}

Мы просто взяли байтовые данные из тела запроса и демаршалировали JSON. Я видел какое-то решение, данное другими, но кажется, что это журнальный способ, поэтому я все равно добавляю ответ, хотя он помечен как решенный

Используя платформу 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"])
    }
}
Другие вопросы по тегам