[13th][Day18] Unmarshal

有句话说,没用过 unmarshal 就等於没写过 go

func Unmarshal(data []byte, v interface{}) error

Unmarshal parses the JSON-encoded data and stores the result in the value pointed to by v. If v is nil or not a pointer, Unmarshal returns an InvalidUnmarshalError.

简单来说,收到 data ,用 unmarshal 的方式解到 v 所指向的值
data 须为 []byte 型态 ,v 通常会用 &x 这种写法

本身用过的 unmarshal 方式有两种
1.指定 struct 的方式
2.用 map[string]interface{} 的方式

先定义一个天线宝宝 struct

type Teletubbies struct {
	Name  string
	Color string
}

准备一个 要用来解开的string

sliceString := `[{"Name": "Tinky Winky", "Color": "Purple"},{"Name": "Dipsy",    "Color": "Green"}]`

注意~~这是一个 slice 而非 json 格式哦

用 struct 的方式解开他

x1 := []Teletubbies{}
	err := json.Unmarshal([]byte(sliceString), &x1)
	if err != nil {
		fmt.Println(err)
		return
	}

unmarshal 非常容易发生错误,请做好错误处理

也可以用 map[string]interface 的方试是看看

	mapInSlice := []map[string]interface{}{}
	err = json.Unmarshal([]byte(sliceString), &mapInSlice)
	if err != nil {
		fmt.Println(err)
		return
	}
	fmt.Println(mapInSlice)

接下来我们就要解看看 json 格式罗

mapString := `{"kk1":{"Name": "Tinky Winky", "Color": "Purple"},"kk2":{"Name": "Dipsy",    "Color": "Green"},"kk3":{"Name": "Laa-Laa"}}`

layer1 := make(map[string]interface{})
	err = json.Unmarshal([]byte(mapString), &layer1)
	if err != nil {
		fmt.Println(err)
		return
	}

	fmt.Println(layer1)
	fmt.Println(layer1["kk1"])

此时的 layer1["kk1"]仍然是一个 map ,但型态为 interface{}
可以用 assertion 来断言

if _, ok := layer1["kk1"].(map[string]interface{}); ok {
		layer2 := layer1["kk1"].(map[string]interface{})
		fmt.Println(layer2["Name"])
	}

上面说到 unmarshal 很容易坏掉,assertion 也是很容易坏掉的,做好错误处理 or 更多的预防可以减少服务爆炸的风险。


<<:  Day13 用磁碟机播放唱片

>>:  [13th][Day20] docker network

伸缩自如的Flask [day 28] Flask-Mail

在有必要的时候,我们可能需要使用寄信来通知使用者、寄信给公会小姐、 把AI数据视觉化的资料寄给老板。...

Day 15 | 魔术方块AR游戏开发Part4 - 面的旋转(下)+游戏机制

在上一篇我们完成面的旋转,却发现旋转途中若点击放开,面会停留在旋转途中,今天我们就要来解决这个问题。...

误用案例测试(Misuse case testing)最不可能包含在软件整合测试(integration test)中

-代码仓库:git 顾名思义,整合测试结合了代码单元、模组或子系统并对其进行测试。在托管代码储存库...

[第06天]理财达人Mx. Ada-下单作业

前言 本文说明如何进行下单作业。 程序实作 # 设定交易标的 # 以台股上市股票:长荣 contra...

Day 16 | 同步与非同步- Coroutines的Scope

Scope Scope 指得是Coroutines 可以作用的范围。 在Main thread上或I...