我有一个应用程序,其类型是
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”字段,但如果该字段可以是其中之一怎么办?
查看文档中的“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)
| 归档时间: |
|
| 查看次数: |
7353 次 |
| 最近记录: |