解组 json 字段是 int 或 string

Mic*_*elB 3 go

我有一个应用程序,其类型是

type Person struct {
  Name string `json:"name"`
  Age  int    `json:"age"`
}
Run Code Online (Sandbox Code Playgroud)

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

{
  "name": "Joe",
  "age": "42"
}
Run Code Online (Sandbox Code Playgroud)

或者

{
  "name": "Joe",
  "age": 42
}
Run Code Online (Sandbox Code Playgroud)

我知道如果我想将“age”字段强制转换为整数,我可以用“,string”注释“age”字段,但如果该字段可以是其中之一怎么办?

sHa*_*ann 5

查看文档中的“json - raw Message” ,从那里开始,您可以尝试按照您想要的方式解析它。下面和GoPlayground上的示例

package main

import (
    "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")
    }
}

Run Code Online (Sandbox Code Playgroud)