解决golang json解析出现值为空的问题,主要是由于json字段中对应的值为null,而golang在解析json时,会忽略掉null值,导致对应的struct中的该字段值为空白值。以下是解决该问题的完整攻略:
1. 解析为map[string]interface{}
可以先将json解析为map[string]interface{},然后针对需要的字段进行类型断言获取对应的值。这种方法比较适合处理json结构不规整的情况。
示例:
import (
"encoding/json"
"fmt"
)
func main() {
str := `{
"name": "张三",
"age": 18,
"hobby": null
}`
var data map[string]interface{}
err := json.Unmarshal([]byte(str), &data)
if err != nil {
fmt.Println("json unmarshal error:", err)
return
}
name, ok := data["name"].(string)
if !ok {
fmt.Println("name is not string")
} else {
fmt.Println("name:", name)
}
age, ok := data["age"].(float64)
if !ok {
fmt.Println("age is not number")
} else {
fmt.Println("age:", age)
}
hobby, ok := data["hobby"]
if !ok {
fmt.Println("hobby is null")
} else if hobby == nil {
fmt.Println("hobby is nil")
} else {
fmt.Println("hobby:", hobby)
}
}
输出结果:
name: 张三
age: 18
hobby is null
2. 自定义解析器
通过实现golang中json.Unmarshaler接口,可以自定义json解析器,重写json解析过程,在解析json时对null值进行特殊处理,从而避免字段对应的值为空白值的问题。
示例:
import (
"encoding/json"
"fmt"
)
type Student struct {
Name string `json:"name"`
Age int `json:"age"`
Hobby string `json:"hobby"`
}
func (s *Student) UnmarshalJSON(data []byte) error {
type Alias Student
aux := &struct {
*Alias
Hobby *string `json:"hobby"`
}{
Alias: (*Alias)(s),
Hobby: &s.Hobby,
}
if err := json.Unmarshal(data, &aux); err != nil {
return err
}
if aux.Hobby != nil {
s.Hobby = *aux.Hobby
} else {
s.Hobby = "无"
}
return nil
}
func main() {
str := `{
"name": "张三",
"age": 18,
"hobby": null
}`
var student Student
err := json.Unmarshal([]byte(str), &student)
if err != nil {
fmt.Println("json unmarshal error:", err)
return
}
fmt.Println("name:", student.Name)
fmt.Println("age:", student.Age)
fmt.Println("hobby:", student.Hobby)
}
输出结果:
name: 张三
age: 18
hobby: 无
通过自定义解析器,重写了对应json字段的解析过程,使得解析时对hobby字段为null值时,将对象中该字段赋值为"无"。在实际开发中,还可以根据需要使用其他特定的空值来替代null值,从而解决该问题。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:解决golang json解析出现值为空的问题 - Python技术站