20.处理JSON

在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语言数据类型对应如下:

image-20210129100652275

处理通过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
喜欢就支持以下吧
点赞0
分享
评论 抢沙发
四曲的头像-四曲博客

昵称

取消
昵称表情代码图片