Go结构体JSON反序列化时如何将字符串“0”“1”转换为布尔值?
Go 反序列化字符串格式"0"/"1"为布尔值的解决方案
首先修正你原有代码的两个基础问题:
- Go 标准库
encoding/json只能访问结构体的公开字段,所以你定义的hwo结构体字段首字母必须大写,否则反序列化会直接忽略这些字段 json.Unmarshal第二个参数必须传结构体指针,否则无法修改结构体内部的字段值
方案1:自定义布尔类型,实现json.Unmarshaler接口(推荐)
这种方案可以完全复用标准库的反序列化逻辑,无需额外处理步骤,后续使用也和普通bool类型一致。
// 自定义布尔类型,支持从字符串"0"/"1"反序列化为布尔值 type BoolFromString bool func (b *BoolFromString) UnmarshalJSON(data []byte) error { rawStr := string(data) // 匹配带引号的"0"和"1" if rawStr == `"0"` { *b = false return nil } if rawStr == `"1"` { *b = true return nil } // 可选:兼容原生布尔值、字符串"true"/"false"的场景 return json.Unmarshal(data, (*bool)(b)) } // 替换原有结构体的字段类型 type hwo struct { Normality string `json:"perfectly_normal"` MakeMeBool BoolFromString `json:"fooBool"` } // 反序列化调用示例 var res hwo err := json.Unmarshal(body, &res)
使用时直接把BoolFromString当成普通bool类型判断即可:
if res.MakeMeBool { // 对应原字符串"1"的逻辑 }
方案2:中转字符串字段后手动转换(适合不想自定义类型的场景)
如果不想新增自定义类型,可以先把字段存为字符串,反序列化完成后手动转换为布尔值:
type hwo struct { Normality string `json:"perfectly_normal"` FooBoolStr string `json:"fooBool"` MakeMeBool bool `json:"-"` // json标签加"-"代表不参与序列化/反序列化 } // 反序列化后手动转换 var res hwo err := json.Unmarshal(body, &res) if err == nil { res.MakeMeBool = res.FooBoolStr == "1" }
注意
标准库json自带的,string标签只支持识别字符串格式的"true"和"false",无法识别"0"和"1",所以不能直接用原生bool加json:"fooBool,string"的写法实现需求。
内容的提问来源于stack exchange,提问作者u15p7fgy863eiq5
相关产品推荐
相关产品推荐

