### 概述
在go中,結構體想轉成json,變量名首字母必須是大寫 .
#### 通過結構體生成json
~~~
type Person struct {
Company string //首字母要大寫
Subjects []string
IsOk bool
Price float64
}
func main() {
s := Person{"ali", []string{"PHP", "JAVA", "GO"}, true, 1000}
buf, err := json.Marshal(s) //json.MarshalIndent(s,""," ")可以格式化打印
if err != nil {
fmt.Println(err)
return
}
fmt.Println(string(buf))
}
~~~
~~~
{"Company":"ali","Subjects":["PHP","JAVA","GO"],"IsOk":true,"Price":1000}
~~~
### struct_tag使用
~~~
type Person struct {
Company string `json:"company"` //二次編碼
Subjects []string `json:"-"` //-代表此字段不會輸出到屏幕
IsOk bool `json:",string"` //把bool轉換成字符串
Price float64
}
func main() {
s := Person{"ali", []string{"PHP", "JAVA", "GO"}, true, 1000}
buf, err := json.Marshal(s)
if err != nil {
fmt.Println(err)
return
}
fmt.Println(string(buf))
}
~~~
~~~
{"company":"ali","IsOk":"true","Price":1000}
~~~
### 通過map生成json
~~~
m := make(map[string]interface{}, 4)
m["company"] = "facebook"
m["subjects"] = []string{"PHP", "JAVA", "GO"}
m["isok"] = true
m["price"] = 100
res, err := json.MarshalIndent(m, "", " ") //第三個參數是tab
if err != nil {
fmt.Println(err)
return
}
fmt.Println(string(res))
~~~
~~~
{
"company": "facebook",
"isok": true,
"price": 100,
"subjects": [
"PHP",
"JAVA",
"GO"
]
}
~~~
### json解析到結構體
~~~
type Person struct {
Company string
Subjects []string
IsOk bool
Price float64
}
type Person1 struct {
Company string
Subjects []string
}
func main() {
jsonBuf := `{
"company": "facebook",
"isok": true,
"price": 100,
"subjects": [
"PHP",
"JAVA",
"GO"
]
}`
var p Person
err := json.Unmarshal([]byte(jsonBuf), &p) //這里必須是取地址
if err != nil {
fmt.Println(err)
return
}
fmt.Println(p)
fmt.Printf("%+v\n", p)
var p1 Person1
err = json.Unmarshal([]byte(jsonBuf), &p1) //這里必須是取地址
if err != nil {
fmt.Println(err)
return
}
fmt.Println(p1)
fmt.Printf("%+v\n", p1)
}
~~~
~~~
{facebook [PHP JAVA GO] true 100}
{Company:facebook Subjects:[PHP JAVA GO] IsOk:true Price:100}
{facebook [PHP JAVA GO]}
{Company:facebook Subjects:[PHP JAVA GO]}
~~~
### json解析到map
相比于結構體,map要復雜一點,因為要通過類型斷言來反推類型.
~~~
func main() {
jsonBuf := `{
"company": "facebook",
"isok": true,
"price": 100,
"subjects": [
"PHP",
"JAVA",
"GO"
]
}`
m := make(map[string]interface{}, 4)
err := json.Unmarshal([]byte(jsonBuf), &m)
if err != nil {
fmt.Println(err)
return
}
//fmt.Printf("%+v", m)
var str string
//str = m["company"] //無法直接賦值,哪怕用string()也不行
//fmt.Println(str)
for key, value := range m {
switch data := value.(type) {
case string:
str = data
fmt.Printf("字符串類型,key = %s,value = %s\n", key, str)
case bool:
fmt.Printf("布爾類型,key = %s,value = %v\n", key, data)
case float64:
fmt.Printf("布爾類型,key = %s,value = %v\n", key, data)
case []interface{}:
//這個要注意
fmt.Printf("切片類型,key = %s,value = %v\n", key, data)
}
}
}
~~~
~~~
布爾類型,key = isok,value = true
布爾類型,key = price,value = 100
切片類型,key = subjects,value = [PHP JAVA GO]
字符串類型,key = company,value = facebook
~~~
### 自定義struct轉json
實現以下兩個接口即可
~~~
type Marshaler interface {
MarshalJSON() ([]byte, error)
}
type Unmarshaler interface {
UnmarshalJSON([]byte) error
}
~~~
- 基本語法
- 申明變量
- 常量
- 數據類型
- 強制類型轉換
- 獲取命令行參數
- 指針
- 概述
- new函數
- 函數
- 概述
- 不定參數類型
- 有返回值
- 函數類型
- 回調函數
- 匿名函數和閉包
- 延遲調用defer
- 工程管理
- 工作區
- src,pkg和bin目錄
- 復合類型
- 概述
- 數組
- 概述
- 聲明并初始化
- 拷貝傳值
- slice
- 概述
- 創建切片
- 切片截取
- 切片和底層數組的關系
- slice常用方法
- 切片做函數參數
- map
- 概述
- map操作
- 結構體
- 概述
- 結構體初始化
- 結構體比較
- 結構體作為函數參數
- 結構體前加&
- 面向對象
- 概述
- 匿名組合
- 方法
- 值語義和引用語義
- 方法集
- 方法的繼承
- 方法重寫
- 方法值
- 接口
- 接口定義和實現
- 多態的表現
- 接口繼承
- 接口轉換
- 空接口
- 類型斷言
- 異常處理
- error接口
- panic
- recover
- 文本文件處理
- 字符串操作
- 正則表達式
- json處理
- 文件操作
- 標準設備文件操作
- 并發編程
- 概述
- 并發和并行
- go語言并發優勢
- goroutine
- goroutine概述
- 創建goroutine
- 主協程先退出
- runtime包
- Gosched
- Goexit
- GOMAXPROCE
- channel
- 多資源競爭
- channel類型
- 無緩沖channel
- 有緩沖channel
- 關閉channel
- 單向channel
- 單向channel特性
- 定時器
- Timer
- Ticker
- select
- select作用
- 超時
- sync
- 競爭狀態
- 網絡編程
- 網絡概述
- 網絡協議
- 分層模型
- 網絡分層架構
- 層與協議
- 每層協議的功能
- 鏈路層
- 網絡層
- 傳輸層
- 應用層
- socket編程
- 組合和繼承
- 注意事項
- 細節
- go語言實現隊列
- google工程師golang
- 基礎語法
- 內建容器
- 面向"對象"
- 依賴管理
- 面向接口
- 函數式編程
- 錯誤處理和資源管理
- 測試與性能調優
- goroutine
- channel
- golang問題集
- 斷言和類型轉換
- Go語言圣經
- 入門
- 程序結構
- 命名
- 聲明
- 變量
- 賦值
- 類型
- 包和文件
- 作用域
- 基礎數據類型
- 整數
- 浮點數
- 復數
- 布爾型
- 字符串
- 常量
- 復合數據類型
- 數組
- slice
- map
- 結構體
- json
- 文本和HTML模板
- 函數
- 函數聲明
- 錯誤
- 函數值
- 匿名函數
- defer
- panic
- recover
- 方法
- 方法聲明
- 指針對象的方法
- 封裝
- 接口
- 說明
- 接口是合約
- 實現接口的條件
- 接口值
- 類型斷言
- 通過類型斷言詢問行為
- 類型開關
- Goroutines和Channels
- 協程
- channels
- 無緩沖channel
- 串聯的channel
- 有緩沖channel
- 并發的循環
- select多路復用
- 并發的退出
- 并發問題的自我思考
- 基于共享變量的并發
- 競爭條件
- 互斥鎖
- 讀寫鎖
- 內存同步
- sync.Once
- 協程和線程
- 包和工具
- 測試
- 反射
- 什么是反射
- 為什么需要反射
- reflect.Type和reflect.Value
- 通過reflect.Value修改值
- 底層編程