美文网首页Go
兄弟连区块链培训清华尹成带你实战GO案例(11)Go JSON支

兄弟连区块链培训清华尹成带你实战GO案例(11)Go JSON支

作者: ab6973df9221 | 来源:发表于2018-07-25 17:36 被阅读47次

  兄弟连区块链培训课程体系设计架构包括了区块链的基础语言Go语言、区块链后端技术体系、区块链公链、区块链分布式应用开发等内容讲解,以及到最后的面试指导和项目实战。课程由清华微软谷歌名师团队精心打造,历时半年时间共同研发而出。 

Go JSON支持Go内置了对JSON数据的编码和解码,这些数据的类型包括内置数据类型和自定义数据类型。

package main

import "encoding/json"

import "fmt"

import "os"

// 我们使用两个结构体来演示自定义数据类型的JSON数据编码和解码。

type Response1 struct {

Page int

Fruits []string

}

type Response2 struct {

Page int `json:"page"`

Fruits []string `json:"fruits"`

}

func main() {

// 首先我们看一下将基础数据类型编码为JSON数据

bolB, _ := json.Marshal(true)

fmt.Println(string(bolB))

intB, _ := json.Marshal(1)

fmt.Println(string(intB))

fltB, _ := json.Marshal(2.34)

fmt.Println(string(fltB))

strB, _ := json.Marshal("gopher")

fmt.Println(string(strB))

// 这里是将切片和字典编码为JSON数组或对象

slcD := []string{"apple", "peach", "pear"}

slcB, _ := json.Marshal(slcD)

fmt.Println(string(slcB))

mapD := map[string]int{"apple": 5, "lettuce": 7}

mapB, _ := json.Marshal(mapD)

fmt.Println(string(mapB))

// JSON包可以自动地编码自定义数据类型。结果将只包括自定义

// 类型中的可导出成员的值并且默认情况下,这些成员名称都作

// 为JSON数据的键

res1D := &Response1{

Page: 1,

Fruits: []string{"apple", "peach", "pear"}}

res1B, _ := json.Marshal(res1D)

fmt.Println(string(res1B))

// 你可以使用tag来自定义编码后JSON键的名称

res2D := &Response2{

Page: 1,

Fruits: []string{"apple", "peach", "pear"}}

res2B, _ := json.Marshal(res2D)

fmt.Println(string(res2B))

fmt.Println(string(res2B))

// 现在我们看看解码JSON数据为Go数值

byt := []byte(`{"num":6.13,"strs":["a","b"]}`)

// 我们需要提供一个变量来存储解码后的JSON数据,这里

// 的`map[string]interface{}`将以Key-Value的方式

// 保存解码后的数据,Value可以为任意数据类型

var dat map[string]interface{}

// 解码过程,并检测相关可能存在的错误

if err := json.Unmarshal(byt, &dat); err != nil {

panic(err)

}

fmt.Println(dat)

// 为了使用解码后map里面的数据,我们需要将Value转换为

// 它们合适的类型,例如我们将这里的num转换为期望的float64

num := dat["num"].(float64)

fmt.Println(num)

// 访问嵌套的数据需要一些类型转换

strs := dat["strs"].([]interface{})

str1 := strs[0].(string)

fmt.Println(str1)

// 我们还可以将JSON解码为自定义数据类型,这有个好处是可以

// 为我们的程序增加额外的类型安全并且不用再在访问数据的时候

// 进行类型断言

str := `{"page": 1, "fruits": ["apple", "peach"]}`

res := &Response2{}

json.Unmarshal([]byte(str), &res)

fmt.Println(res)

fmt.Println(res.Fruits[0])

// 上面的例子中,我们使用bytes和strings来进行原始数据和JSON数据

// 之间的转换,我们也可以直接将JSON编码的数据流写入`os.Writer`

// 或者是HTTP请求回复数据。

enc := json.NewEncoder(os.Stdout)

d := map[string]int{"apple": 5, "lettuce": 7}

enc.Encode(d)

}

运行结果true12.34"gopher"["apple","peach","pear"]{"apple":5,"lettuce":7}{"Page":1,"Fruits":["apple","peach","pear"]}{"page":1,"fruits":["apple","peach","pear"]}map[num:6.13 strs:[a b]]6.13a&{1 [apple peach]}apple{"apple":5,"lettuce":7}

  是科技发展太快,还是我们已经掉尾?7月7日起,每天两小时跟清华微软谷歌大牛团队一起实战区块链。http://www.ydma.cn/open/course/16来来来,清华学霸尹成大哥带你飞起来~~~

相关文章

网友评论

    本文标题:兄弟连区块链培训清华尹成带你实战GO案例(11)Go JSON支

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