package main
import (
"encoding/json"
"errors"
"fmt"
)
type A struct {
Br Boolean `json:"br"`
}
func main() {
var c A
json.Unmarshal([]byte(`{"br":"true"}`), &c)
fmt.Println(c)
}
type Boolean int
const (
isTrue = 10
isFalse = -10
isNull = 0
)
func (b Boolean) MarshalJSON() (by []byte, err error) {
switch b {
case isTrue:
by = []byte("true")
case isFalse:
by = []byte("false")
default:
by = []byte("null")
}
return
}
func (b *Boolean) UnmarshalJSON(data []byte) error {
switch string(data) {
case `1`, `t`, `T`, `true`, `TRUE`, `True`, `"1"`, `"t"`, `"T"`, `"true"`, `"TRUE"`, `"True"`:
*b = isTrue
case `0`, `f`, `F`, `false`, `FALSE`, `False`, `"0"`, `"f"`, `"F"`, `"false"`, `"FALSE"`, `"False"`:
*b = isFalse
case `null`:
*b = isNull
default:
return errors.New("不是正确类型")
}
return nil
}
func (b Boolean) IsNull() bool {
return b == isNull
}
func (b Boolean) IsBool() bool {
return b == isTrue
}