首页 > 后端开发 > 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 的函数

问题:

如何我在 Golang 中有效地将结构转换为映射,利用 JSON 标签作为键,其中可能吗?

答案:

第三方库:

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 结构体转换为 Map?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板