在Go语言中使用JSON
Go语言非常适合用来创建收发JSON的客户端和服务器。标准库提供了encoding/json包,可用于编码和解码JSON格式
编码意味着将数据转换为编码后的格式,函数Marshal,可用于将Go数据编码为json
package main
import (
"encoding/json"
"fmt"
"log"
)
type Person struct{
//结构体属性名称一定要大写开头,否则会转换失败
Name string
Age int
}
func main(){
p :=Person{Name:"siqu",Age:16}
fmt.Printf("%v\n",p)
jsonByteData,err := json.Marshal(p)
if err !=nil{
log.Fatal(err)
}
fmt.Println(string(jsonByteData))
}
在上面的这个实例中,结构体属性是大写开头的,但是json格式的数据键名都是以驼峰命名法为标准,因此我们可以给结构体提供数字字段指定标签,对于JSON标签的数据,将使用标签中的数据替换它
type Person struct{
Name string `json:"name"`
Age int `json:"age"`
}
package main
import (
"encoding/json"
"fmt"
"log"
)
type Person struct{
Name string `json:"name"`
Age int `json:"age"`
}
func main(){
p :=Person{Name:"siqu",Age:16}
fmt.Printf("%v\n",p)
jsonByteData,err := json.Marshal(p)
if err !=nil{
log.Fatal(err)
}
fmt.Println(string(jsonByteData))
}
// {siqu 16}
// {"name":"siqu","age":16}
当结构体属性值为空时,在标签中指定json忽略空值的属性
type Person struct{
Name string `json:"name"`
Age int `json:"age,omitempty"`
}
解码结构体
原始JSON就是文本格式的数据,在Go语言中可表示为字符串,函数Unmarsha接受一个字节切片以及一个要将数据解码为何种格式的接口,根据数据是如何收到的,它可能是字节切片,也可能不是。如果不是字节切片,就必须进行转换,再将其传递给函数Unmarshal
//将json数据解码为结构体
package main
import (
"encoding/json"
"fmt"
"log"
)
type Person struct{
Name string
age int
}
func main(){
jsonStringData :=`{"name":"siqu","age":16}`
jsonByteData :=[]byte(jsonStringData)
p := Person{}
err:=json.Unmarshal(jsonByteData,&p)
if err !=nil{
log.Fatal(err)
}
fmt.Printf("%+v\n",p)
}
映射数据类型
JSON是javaScript的一个子集,数据类型与Go语言数据类型对应如下:
处理通过HTTP收到的JSON
通过HTTP请求获取JSON时,收到的数据为流而不是字符串或者字节切片
可以使用encoding/json包中的函数NewDecoder。这个函数接受一个io.Reader(这正是Http.Get返回的类型),并返回一个Decoder。通过对返回Decoder调用方法Decode,可将数据解码为结构体,Decode也接受一个结构体,因此必须创建一个结构体实例
package main
import (
"encoding/json"
"fmt"
"log"
"net/http"
)
type User struct{
Name string `json:"name"`
Blog string `json:"name"`
}
func main(){
var u User
res,err := http.Get("https://api.github.com/users/shapeshed")
if err != nil{
log.Fatal(err)
}
defer res.Body.Close()
err = json.NewDcoder(res.Body).Decode(&u)
if err != nil{
log.Fatal(err)
}
fmt.Printf("%+v\n",u)
}
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END
暂无评论内容