Извлечь 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"])
}
}