当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
在处理不固定格式的JSON字符串时,由于无法预先定义结构体,Golang中可以使用json.RawMessage来保存原始字节数据,以便后续进行解析。json.RawMessage实际上是一个[]byte类型的别名,方便对不确定结构的JSON进行操作。
1134

被折叠的 条评论
为什么被折叠?



