You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Go语言JSON反序列化时能否自动将FirstName转为小写?

在Go中JSON反序列化时自动转换字段为小写

完全可以实现这个需求,下面给两种实用方案:

方案一:自定义类型实现反序列化接口(推荐,可复用)

通过给字符串类型自定义一个实现json.Unmarshaler接口的包装类型,让反序列化过程自动完成小写转换:

import (
    "encoding/json"
    "strings"
)

// 自定义一个用于自动转小写的字符串类型
type LowercaseString string

// 实现json.Unmarshaler接口
func (ls *LowercaseString) UnmarshalJSON(data []byte) error {
    var rawStr string
    // 先把JSON数据反序列化成普通字符串
    if err := json.Unmarshal(data, &rawStr); err != nil {
        return err
    }
    // 转成小写后赋值给自定义类型
    *ls = LowercaseString(strings.ToLower(rawStr))
    return nil
}

// 修改Person结构体,把FirstName的类型换成自定义类型
type Person struct {
    FirstName LowercaseString `json:"first_name"`
    LastName  string          `json:"last_name"`
}

func main() {
    jsonText := GetJsonFromSomewhere()
    var v Person
    if err := json.Unmarshal(jsonText, &v); err != nil {
        // 这里处理反序列化错误
        panic(err)
    }
    // 如果需要把LowercaseString当作普通string使用,直接类型转换即可
    firstName := string(v.FirstName)
}

方案二:反序列化后手动转换(简单场景适用)

如果只是单个地方需要处理,直接在反序列化完成后手动调用strings.ToLower转换:

import (
    "encoding/json"
    "strings"
)

type Person struct {
    FirstName string `json:"first_name"`
    LastName  string `json:"last_name"`
}

func main() {
    jsonText := GetJsonFromSomewhere()
    var v Person
    if err := json.Unmarshal(jsonText, &v); err != nil {
        // 处理错误
        panic(err)
    }
    // 手动转小写
    v.FirstName = strings.ToLower(v.FirstName)
}

内容的提问来源于stack exchange,提问作者Raouf Ben Hassine

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 21:15:32