首頁 > 後端開發 > Golang > 如何使用 JSON 標籤高效率地將 Go 結構體轉換為 Map?

如何使用 JSON 標籤高效率地將 Go 結構體轉換為 Map?

Susan Sarandon
發布: 2024-12-11 18:41:10
原創
245 人瀏覽過

How to Efficiently Convert a Go Struct to a Map Using JSON Tags?

Golang 中將結構體轉換為Map 的函數

問題:

問題:

如何

問題:

如何

問題:

如何

問題:
func Map(object interface{}) map[string]interface{}
登入後複製

如何問在Golang 中有效地將結構轉換為映射,利用JSON 標籤作為鍵,其中可能嗎?

package main

import (
    "fmt"

    "github.com/fatih/structs"
)

type Server struct {
    Name    string `json:"name"`
    ID      int32  `json:"id"`
    Enabled bool   `json:"enabled"`
}

func main() {
    s := &Server{
        Name:    "gopher",
        ID:      123456,
        Enabled: true,
    }

    m := structs.Map(s)
    fmt.Println(m) // Output: {"name":"gopher", "id":123456, "enabled":true}
}
登入後複製

答案:

    第三方函式庫:
  • Fatih 的
  • structs
  • 包為此提供了一個簡單而全面的解決方案任務:

用法:

func ConvertToMap(model interface{}) map[string]interface{} {
    // Get the reflect type and value of the model
    modelType := reflect.TypeOf(model)
    modelValue := reflect.ValueOf(model)
    
    if modelValue.Kind() == reflect.Ptr {
        modelValue = modelValue.Elem()
    }
    
    // Check if the model is a struct
    if modelType.Kind() != reflect.Struct {
        return nil
    }
    
    // Create a new map to store the key-value pairs
    ret := make(map[string]interface{})
    
    // Iterate over the fields of the struct
    for i := 0; i < modelType.NumField(); i++ {
        // Get the field and its name
        field := modelType.Field(i)
        fieldName := field.Name
        
        // Check if the field has a JSON tag
        jsonTag := field.Tag.Get("json")
        if jsonTag != "" {
            fieldName = jsonTag
        }
        
        // Get the value of the field
        fieldValue := modelValue.Field(i)
        
        // Recursively convert nested structs
        switch fieldValue.Kind() {
        case reflect.Struct:
            ret[fieldName] = ConvertToMap(fieldValue.Interface())
        default:
            ret[fieldName] = fieldValue.Interface()
        }
    }
    
    return ret
}
登入後複製
功能:

支援匿名和巢狀結構使用JSON標籤鍵允許使用標籤過濾欄位自訂實作:如果首選自訂實現,可以使用reflect.Struct : 但是,這需要手動擷取欄位名稱並轉換巢狀結構體。

以上是如何使用 JSON 標籤高效率地將 Go 結構體轉換為 Map?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板