Go | Json部分 | 笔记心得

105 阅读2分钟

转换

基础转换 | Marshal + MarshalIndent

package main

import (
	"encoding/json"
	"fmt"
)

func main() {
	d := map[string][]string{
		"name":  {"亚索"},
		"skill": {"浪客之道", "斩钢闪", "风之障壁", "踏前斩", "狂风绝息斩"},
	}
	// 到Marshal()函数返回的JSON字符串是没有空白字符和缩进的
	// 不是很适合阅读的
	if data, err := json.Marshal(d); err == nil {
		fmt.Printf("%s\n",data)
	}

	// MarshalIndent is like Marshal but applies Indent to format the output.
	// Each JSON element in the output will begin on a new line beginning with prefix
	// followed by one or more copies of indent according to the indentation nesting.
	// 传入的三个参数是 这样的: v any, prefix, indent string
	if data, err := json.MarshalIndent(d,""," "); err == nil {
		fmt.Printf("%s\n",data)
	}
}

结构体转换 | 注意私有和公有

package main

import (
	"encoding/json"
	"fmt"
)

type Hero struct {
	Name      string `json:"_name"`
	Age       int    `json:"_age"`
	Mainskill string `json:"_mainSkill"`
	// 不大写的话 json转换出结果时候 不对外暴露
	// struct field addr has json tag but is not exported
	addr      string `json:"_addr"`  
}

func main() {
	Yasuo := Hero{"亚索", 20, "狂风绝息斩", "艾欧尼亚"}
	fmt.Println(Yasuo)
	info, err:= json.Marshal(Yasuo)
	if err!=nil{
		fmt.Println("出现错误!")
	}
	fmt.Println(string(info))
}

处理匿名字段 | 继承问题

package main

import (
	"encoding/json"
	"fmt"
)
type User struct{
	IkunLevel
	Name string
}
type IkunLevel struct{
	Sing int
	Rap int
	Dance int
}
func main() {
	// json包在解析匿名字段时,会将匿名字段的字段当成该结构体的字段处理
	xiaoHeiZi:=User{
		IkunLevel{1,2,3},"小黑子",
	}
	fmt.Println(xiaoHeiZi)
	if data,err:=json.Marshal(xiaoHeiZi);err==nil{
		fmt.Printf("%s \n",data)
	}
}

补充

  • Marshal()函数只有在转换成功的时候才会返回数据,在转换的过程中需要注意。
  • JSON对象只支持string作为key,所以要编码一个map,必须是map[string]T这种类型(T是Go语言中的任意类型)。
  • channelcomplexfunction是不能被编码成JSON的。
  • 指针在编码的时候会输出指针指向的内容,而空指针会输出null

解析

直接解析

package main

import (
   "encoding/json"
   "fmt"
)
func main() {
   // 1. 直接解析
   data := `[{"Sing":"1","Rap":"2","Dance":"3","Name":"小黑子"}]`
   var dbgInfos []map[string]string
   // 字符串解析为 map切片
   json.Unmarshal([]byte(data), &dbgInfos)
   fmt.Println(dbgInfos)
}

结构体解析

package main

import (
	"encoding/json"
	"fmt"
)

type IkunLevel struct {
	Sing  int
	Rap   int
	Dance int
}

func main() {

	// 2. 结构体解析
	info := `[{"Sing":1,"Rap":2,"Dance":3},` + `{"Sing":2,"Rap":2,"Dance":3}]`
	var ikun []IkunLevel // 解析多个的时候开数组就行
	json.Unmarshal([]byte(info), &ikun)
	fmt.Println(ikun)
}

结构体嵌套 | 匿名字段解析

package main

import (
	"encoding/json"
	"fmt"
)

type User struct {
	IkunLevel
	Name string
}
type IkunLevel struct {
	Sing  int
	Rap   int
	Dance int
}

func main() {	
	// 3. 结构体解析 + 嵌套!
	info := `{"Sing":1,"Rap":2,"Dance":3,"Name":"小黑子"}`
	var xiaoHeiZi User
	json.Unmarshal([]byte(info), &xiaoHeiZi)
	fmt.Println(xiaoHeiZi)
}

附录 | 参考 | 好文

  1. 千锋教育go开发图书(微信读书)
  2. go语言官方json库