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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 08:24:10