go基础之json格式数据处理

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/hjxzb/article/details/81559328

go基础之json格式数据处理

go标准库里面提供了一个包进行go格式的数据处理,官方文档地址:https://golang.org/pkg/encoding/json/ 具体文档大家可以自己去看,这里只记录我自己作为一个初学者踩的坑。

1、结构体小写问题导致出错

type studentInfo struct {
    subjects []string 
    name string 
    id string 
}

一开始我的结构定义如上面所示,但是由于go语法的问题,结构字段首字母如果小写的话不能被其他模块使用,只能被该包内使用,即定义该结构所在文件最上面的package ** 定义的包名。这样我在调用json.Marshal()之后返回的是空的json数据,因为结构体不能被json包正确使用。导致出错。所以第一步需要把结构体的首字母改成大写。

参考阅读:

https://www.blang.io/posts/2014-03_golang-exporting/

https://stackoverflow.com/questions/21825322/why-golang-cannot-generate-json-from-struct-with-front-lowercase-character

https://stackoverflow.com/questions/11693865/lowercase-json-key-names-with-json-marshal-in-go

2、struct没有正确加tag

type studentInfo struct {
    Subjects []string 
    Name string 
    Id string 
}

将结构体定义的字段首字母改成大写之后,调用json.Marshal()之后正常返回了,json格式的数据。但是字段名就如定义的字段一样。但是我实际使用的时候需要是全部小写的字母。

3、struct加上tag

type studentInfo struct {
    Subjects []string 'json:"subjects"'
    Name string 'json:"name"'
    Id string 'json:"id"'
}

定义成上面的格式之后,完美解决了我的问题,正确编码了json格式,字段也正确。

下面是简单的示例:

package main

import (
    "fmt"
    "encoding/json"
    "os"
)

func main(){
    type StudentInfo struct {
        Subjects []string 'json:"subjects"'
        Name string 'json:"name"'
        Id string 'json:"id"'
    }


    subjects :=  []string{fmt.Sprintf("\"192.168.43.127\"")}

    student := new(StudentInfo)
    student.Name = "zhangsan"
    student.Id = "123456"
    student.Subjects = subjects

    jsonStr, err := json.Marshal(student)
    if err != nil{
        fmt.Printf("%s", err)
    }
    fmt.Printf("%+v\n",tunnel)
    os.Stdout.Write(jsonStr)
    fmt.Printf("\n")

}

更多相关例子请查看:https://golang.org/pkg/encoding/json/#example_Marshal

4、struct tag扩展

官方参考文档链接:https://godoc.org/reflect#StructTag.Get

tag最有用的功能之一是指定字段名称映射。如果您需要进行大量数据转换,它会非常方便。 比如数据库的ORM实现,很多都是使用这个tag特性实现的。tag底层用的方法是reflect实现的。下面是官方给出的示例代码:

type S struct {
    F string `species:"gopher" color:"blue"`
}

s := S{}
st := reflect.TypeOf(s)
field := st.Field(0)
fmt.Println(field.Tag.Get("color"), field.Tag.Get("species"))

更多拓展阅读:

https://github.com/golang/go/wiki/Well-known-struct-tags

https://sosedoff.com/2016/07/16/golang-struct-tags.html

猜你喜欢

转载自blog.csdn.net/hjxzb/article/details/81559328