Maison >développement back-end >Golang >Comment convertir efficacement une structure Go en une carte à l'aide de balises JSON ?

Comment convertir efficacement une structure Go en une carte à l'aide de balises JSON ?

Susan Sarandon
Susan Sarandonoriginal
2024-12-11 18:41:10332parcourir

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

Fonction de conversion d'une structure en carte dans Golang

Question :

Comment peut-on Je convertis efficacement une structure en carte dans Golang, en utilisant les balises JSON comme clés où possible ?

Réponse :

Bibliothèque tierce :

Le package structs de Fatih fournit une solution simple et complète pour cela tâche :

func Map(object interface{}) map[string]interface{}

Utilisation :

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}
}

Caractéristiques :

  • Prend en charge les structures anonymes et imbriquées
  • Utilise des balises JSON pour clés
  • Permet le filtrage des champs à l'aide de balises

Implémentation personnalisée :

Si une implémentation personnalisée est préférée, Reflect.Struct peut être utilisé :

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
}

Cependant, cela nécessite d'extraire manuellement les noms de champs et de convertir les noms imbriqués structures.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn