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
Libérer: 2024-12-11 18:41:10
original
245 Les gens l'ont consulté

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{}
Copier après la connexion

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}
}
Copier après la connexion

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
}
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal