ホームページ > バックエンド開発 > Golang > JSON タグを使用して Go 構造体をマップに効率的に変換するにはどうすればよいですか?

JSON タグを使用して Go 構造体をマップに効率的に変換するにはどうすればよいですか?

Susan Sarandon
リリース: 2024-12-11 18:41:10
オリジナル
245 人が閲覧しました

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

Golang で構造体をマップに変換する関数

質問:

どうすればよいですかJSON タグをキーとして利用して、Golang で構造体をマップに効率的に変換します。可能ですか?

答え:

サードパーティ ライブラリ:

Fatih による structs パッケージこれに対する単純かつ包括的なソリューションを提供しますタスク:

func Map(object interface{}) map[string]interface{}
ログイン後にコピー

使用法:

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}
}
ログイン後にコピー

機能:

  • 匿名構造体とネストされた構造体をサポート
  • JSON タグを使用しますキー
  • タグを使用したフィールドのフィルタリングを許可します

カスタム実装:

カスタム実装が優先される場合は、reflect.Struct を利用できます。 :

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 タグを使用して Go 構造体をマップに効率的に変換するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート