解决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)
    }
}

输出结果:

Python技术站热门推荐:
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值,从而解决该问题。

Python技术站热门推荐

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:解决golang json解析出现值为空的问题 - Python技术站