[golang] 구조체를 맵 [string]interface {}로 변환
개시하다
제스처로 맵[string]interface {}을 만드는 것이 게으르다고 생각해서 구조체에서 자동으로 생성할 수 있는 방법을 찾아봤어요.
UnexportedField 이외의 요소로 맵을 만드는 부분은 힘들다.
또 구조체가 중첩된 경우도 힘들다.
json.마사하르와 제이슨.Unmarshal 활용
결론부터 말하자면, 우리의 방법으로 해결한 것이다.
서술을 시작했는데, 고생한 2시가 능숙해졌다.
코드는 다음과 같습니다.
struct.go
type PrimaryID struct {
ID int32 `json:"-"`
HashID string `json:"hash_id"`
}
type User struct {
tableName struct{}
PrimaryID
Name string `json:"name"`
}
json.gofunc StructToJsonTagMap(data interface{}) (map[string]interface{}, error) {
jsonStr, err := json.Marshal(data)
if err != nil {
return nil, err
}
out := new(bytes.Buffer)
// JSONの整形
err = json.Indent(out, jsonStr, "", " ")
if err != nil {
return nil, err
}
var mapData map[string]interface{}
if err := json.Unmarshal([]byte(out.String()), &mapData); err != nil {
return nil, err
}
return mapData, err
}
[WIP] 구조체에서 맵 [string]interface {} 직접 만들기
나도 할 수 있을 텐데, 포기했어.
끼워 넣은 구조체로 맵을 만들 수 있는 사람???
댓글로 알려주시면 좋겠네요.
json.go
func StructToJsonTagMap(data interface{}) map[string]interface{} {
result := make(map[string]interface{})
elem := reflect.ValueOf(data).Elem()
size := elem.NumField()
//最初はテーブル名のため i=1から
for i := 1; i < size; i++ {
field := elem.Type().Field(i).Tag.Get("json")
if field == "-" {
continue
}
value := elem.Field(i).Interface()
result[field] = value
}
return result
}
[WIP]에서 키를 지정하지 않은 경우
json.go
func StructToMap(data interface{}) map[string]interface{} {
result := make(map[string]interface{})
elem := reflect.ValueOf(data).Elem()
size := elem.NumField()
for i := 0; i < size; i++ {
field := elem.Type().Field(i).Name
value := elem.Field(i).Interface()
result[field] = value
}
return result
}
컨디션
참고 자료
Reference
이 문제에 관하여([golang] 구조체를 맵 [string]interface {}로 변환), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://zenn.dev/torkralle/articles/4e4d0f703d8122텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)