json解析bool

解析json到struct的对应的bool字段,如果判断json里面这个字段是为空还是false

type A struct{
    B Bool   `json:"b"`
}

定义了上面的结构体,现在要解析下面的两个字符串到A里面:

// 解析字符串
d1:=`{"b":false}`
d2:=`{}`

如果判断d2没有带bool

已邀请:

philc - https://github.com/philchia

赞同来自: astaxie songtianyi tonyluj voidint geidoo worcsrcsgg yong27 liushuchun lwhile sheepbao onn更多 »

把B声明为指针

type A struct {
    B *bool `json:"b"`
}

func main() {
    var a A

    str := `{"b":false}`
    json.Unmarshal([]byte(str), &a)
    if a.B != nil {
        log.Println(*a.B)
    }
}

SunisDown - @douban

赞同来自:

貌似没有什么好的方法判断 d2 中是写了 b:false 还是压根没写 b,A 初始化的时候 B 会被初始化成 false。 应该有两种选择,一种是转成 map 看是否有这个字段。 一种是默认如果不填这个字段则为 false

stevewang

赞同来自:

要是我,我会写一个可复用的类型来处理这个情况:

type NullBool struct {
    Valid bool // Valid is true if Bool is not NULL
    Bool  bool
}

func (this *NullBool) UnmarshalJSON(b []byte) error {
    str := string(b)
    switch str {
    case "true":
        this.Valid = true
        this.Bool = true
    case "false":
        this.Valid = true
        this.Bool = false
    case "":
        this.Valid = false
        this.Bool = false
    default:
        return fmt.Errorf("invalid bool: %s", str)
    }
    return nil
}

type A struct {
    B NullBool `json:"b"`
}

lotus

赞同来自:

其实我觉得接口定义的时候就应该定义成缺省时符合程序逻辑的样子

要回复问题请先登录注册