Golang

[Golang] Request Bodyをオブジェクトや配列に変換

 


Controller.go

// create birth_days
func (controller_birthday BirthDayController) CreateBirthDay(w http.ResponseWriter, r *http.Request) (Response.ApiResponseInterface) {
  input_data := []usecase_create_birth_day.CreateBirthDayRequest{}
  Request.JsonDecode(r, &input_data)
  controller_birthday.i_create_birth_day_interactor.Handle(input_data)
  return Response.NewCreateSuccessResponse()
}

 

 

 

Request/RequestBody.go

package Request

import (
  "net/http"
  "encoding/json"
  "io"
  "log"
)

// Map request body to specified object
func JsonDecode[T any](r *http.Request, inputData *T) {
  body, err := io.ReadAll(r.Body)
  if err != nil {
    log.Fatalf("failed JsonDecode when io.ReadAll. %v", err)
  }
  // finally must close
  defer r.Body.Close()
  err = json.Unmarshal(body, &inputData)
  if err != nil {
    log.Fatalf("failed JsonDecode when Unmarshal %v", err)
  }
}

Genericが活躍した😼

https://go.dev/doc/tutorial/generics

 

reflectとforで実装例

 

@see Teratail

 

func structToMap(data interface{}) []map[string]string {
	rv := reflect.ValueOf(data)
	maps := make([]map[string]string, 0, rv.Len())

	for i := 0; i < rv.Len(); i++ {
		st := rv.Index(i)
		rt := st.Type()

		// マップに代入
		m := make(map[string]string)
		for i := 0; i < rt.NumField(); i++ {
			m[rt.Field(i).Name] = st.Field(i).String()
		}

		maps = append(maps, m)
	}
	return maps
}

 

 

Amazonおすすめ

iPad 9世代 2021年最新作

iPad 9世代出たから買い替え。安いぞ!🐱 初めてならiPad。Kindleを外で見るならiPad mini。ほとんどの人には通常のiPadをおすすめします><

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)