解组 json 字段是 int 或 string

我有一个类型是的应用程序


type Person struct {

  Name string `json:"name"`

  Age  int    `json:"age"`

}

但是我们有旧客户端将Age字段作为字符串或整数发送,所以......


{

  "name": "Joe",

  "age": "42"

}

或者


{

  "name": "Joe",

  "age": 42

}

我知道我可以用“,字符串”注释“年龄”字段,如果它是一个我想强制转换为整数的字符串,但如果该字段可以是其中之一怎么办?


人到中年有点甜
浏览 126回答 2
2回答

慕容3067478

查看文档中的“json - raw Message” ,从那里开始,您可以根据需要尝试解析它。package mainimport (    "encoding/json"    "fmt"    "log"    "strconv"    "unicode/utf8")type Person struct {    Name string          `json:"name"`    Age  json.RawMessage `json:"age"`}func main() {    var j = []byte(`{"name": "Joe","age": "42"}`)    var j2 = []byte(`{"name": "Joe","age": 42}`)    stringOrInt(j)    stringOrInt(j2)}func stringOrInt(bytes []byte) {    var p Person    err := json.Unmarshal(bytes, &p)    if err != nil {        log.Fatal(err)    }    if utf8.Valid(p.Age) {        i, err := strconv.Atoi(string(p.Age))        if err != nil {            fmt.Println("got int " + strconv.Itoa(i))        } else {            fmt.Println("got string")        }    } else {        fmt.Println("whoops")    }}

慕娘9325324

package mainimport (    "encoding/json"    "fmt"    "strconv")type Person struct {    Name string `json:"name"`    Age  int    `json:"age"`}func (p *Person) UnmarshalJSON(b []byte) error {    var objMap map[string]*json.RawMessage    err := json.Unmarshal(b, &objMap)    if err != nil {        return err    }    var name string    err = json.Unmarshal(*objMap["name"], &name)    if err != nil {        return err    }    var ageInt int    err = json.Unmarshal(*objMap["age"], &ageInt)    if err != nil {        // age  is string        var ageString string        err = json.Unmarshal(*objMap["age"], &ageString)        if err != nil {            return err        }        aI, err := strconv.Atoi(ageString)        if err != nil {            return err        }        p.Age = aI    } else {        p.Age = ageInt    }    p.Name = name    fmt.Printf("%+v", *p)    return nil}func main() {    p := `{"name": "John", "age": "10"}`    //  p := `{"name": "John", "age": 10}`    newP := Person{}    err := newP.UnmarshalJSON([]byte(p))    if err != nil {        fmt.Printf("Error %+v", err)    }}https://play.golang.org/p/AK8H_wdNqmt你可以尝试这样的事情。尝试读取并解析 Into int,如果无法检查字符串值,则将其解析为 int,然后将 int 值分配给 person struct
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go