美文网首页
在Go语言中处理Json

在Go语言中处理Json

作者: louyang | 来源:发表于2021-07-06 17:32 被阅读0次

    下面是一段Json格式的数据:

    {"name":"lane","age":18,"email":["xxx@qq.com","yyy@qq.com"]}
    

    接下来,我们写一段代码,把Json格式的数据做为字符串输入,我们的代码解析后输出到结构体;然后修改结构体,在以字符串格式输出。

    1 将Json string解析为结构体(struct)

    package main
    
    import (
        "log"
        "encoding/json"
    )
    
    type Person struct {
        Name string
        Age int
        Email []string
    }
    
    var json_str = []byte(`{"name":"lane","age":18,"email":["xxx@qq.com","yyy@qq.com"]}`)
    
    func main() {
        p := Person{}
        err := json.Unmarshal(json_str, &p)
        if err != nil {
            log.Print(err)
        } else {
            log.Print(p)
        }
    }
    

    2 将结构体(struct)转换为Json string

    package main
    
    import (
        "log"
        "encoding/json"
    )
    
    type Person struct {
        Name string
        Age int
        Email []string
    }
    
    var json_str = []byte(`{"name":"lane","age":18,"email":["xxx@qq.com","yyy@qq.com"]}`)
    
    func main() {
        p := Person{}
        err := json.Unmarshal(json_str, &p)
        if err != nil {
            log.Print(err)
        } else {
            log.Print(p)
        }
    
        p.Age = 19
        json_str, err := json.Marshal(p)
        if err != nil {
            log.Print(err)
        } else {
            log.Print(string(json_str))
        }
    }
    

    3 使用Struct Tag

    假设我们修改Json string,把age改为how-old,现在Json string是这样的:

    {"name":"lane","how-old":18,"email":["xxx@qq.com","yyy@qq.com"]}
    

    我们原来的代码还能正确运行吗?我们试一下:

    package main
    
    import (
        "log"
        "encoding/json"
    )
    
    type Person struct {
        Name string
        Age int
        Email []string
    }
    
    var json_str = []byte(`{"name":"lane","how-old":18,"email":["xxx@qq.com","yyy@qq.com"]}`)
    
    func main() {
        p := Person{}
        err := json.Unmarshal(json_str, &p)
        if err != nil {
            log.Print(err)
        } else {
            log.Print(p)
        }
    
        p.Age = 19
        json_str, err := json.Marshal(p)
        if err != nil {
            log.Print(err)
        } else {
            log.Print(string(json_str))
        }
    }
    

    运行结果为:

    2021/07/06 12:09:31 {lane 0 [xxx@qq.com yyy@qq.com]}
    2021/07/06 12:09:31 {"Name":"lane","Age":19,"Email":["xxx@qq.com","yyy@qq.com"]}
    

    使用Struct Tag会使情况变好:

    Age int `json:"how-old"`
    

    其中json:"how-old"为Struct Tag, 完整代码如下:

    package main
    
    import (
        "log"
        "encoding/json"
    )
    
    type Person struct {
        Name string
        Age int `json:"how-old"`
        Email []string
    }
    
    var json_str = []byte(`{"name":"lane","how-old":18,"email":["xxx@qq.com","yyy@qq.com"]}`)
    
    func main() {
        p := Person{}
        err := json.Unmarshal(json_str, &p)
        if err != nil {
            log.Print(err)
        } else {
            log.Print(p)
        }
    
        p.Age = 19
        json_str, err := json.Marshal(p)
        if err != nil {
            log.Print(err)
        } else {
            log.Print(string(json_str))
        }
    }
    

    运行结果为:

    2021/07/06 12:23:07 {lane 18 [xxx@qq.com yyy@qq.com]}
    2021/07/06 12:23:07 {"Name":"lane","how-old":19,"Email":["xxx@qq.com","yyy@qq.com"]}
    

    4 使用omitempty

    如果把p.Email设为nil,

        p.Age = 19
        p.Email = nil    // <--- add this line 
    

    则运行结果为:

    2021/07/07 04:28:51 {lane 18 [xxx@qq.com yyy@qq.com]}
    2021/07/07 04:28:51 {"Name":"lane","how-old":19,"Email":null}
    

    其中,也可以省略掉"Email":null
    方法是:

    type Person struct {
        Name string
        Age int `json:"how-old"`
        Email []string `json:"email,omitempty"`    // use omitempty
    }
    

    下面是完整代码:

    package main
    
    import (
        "log"
        "encoding/json"
    )
    
    type Person struct {
        Name string
        Age int `json:"how-old"`
        Email []string `json:"email,omitempty"`
    }
    
    var json_str = []byte(`{"name":"lane","how-old":18,"email":["xxx@qq.com","yyy@qq.com"]}`)
    
    func main() {
        p := Person{}
        err := json.Unmarshal(json_str, &p)
        if err != nil {
            log.Print(err)
        } else {
            log.Print(p)
        }
    
        p.Age = 19
        p.Email = nil
        json_str, err := json.Marshal(p)
        if err != nil {
            log.Print(err)
        } else {
            log.Print(string(json_str))
        }
    }
    

    运行结果:

    2021/07/07 04:33:46 {lane 18 [xxx@qq.com yyy@qq.com]}
    2021/07/07 04:33:46 {"Name":"lane","how-old":19}
    

    相关文章

      网友评论

          本文标题:在Go语言中处理Json

          本文链接:https://www.haomeiwen.com/subject/iwjgultx.html