当json字符串没有固定格式时,反序列化不好定义与其相对应的结构体,此时应使用json.RawMessage将原始字节数据保存下来,再做进一步解析。json.RawMessage其实是[]byte的声明。如:
package main
import (
"encoding/json"
"fmt"
)
type Student struct {
Name string `json:"name"`
Age int `json:"age,string"`
}
func main() {
schoolStr := `{"student":{"name":"jack","age":"20"},"teacher":"lucy"}`
var result map[string]json.RawMessage
if err := json.Unmarshal([]byte(schoolStr), &result); err != nil {
fmt.Printf("json.Unmarshal schoolStr err: %v\n", err)
return
}
var s Student
if err := json.Unmarshal(result["student"], &s); err != nil {
fmt.Printf("json.Unmarshal result['student' err: %v\n]", err)
return
}
fmt.Printf("s: %#v\n", s)
fmt.Printf("s.Age type: %T\n", s.Age)
}
输出:
s: main.Student{Name:"jack", Age:20}
s.Age type: int