1骑素、結(jié)構(gòu)體對(duì)象可生成json字符串炫乓,Marshal()是[]byte,需要string去轉(zhuǎn)換
2献丑、json字符串可以映射到一個(gè)struct末捣,但僅限公共元素(大寫(xiě)開(kāi)頭);也可通用的轉(zhuǎn)換到空接口interfece[]创橄,使用對(duì)應(yīng)轉(zhuǎn)換到需要的內(nèi)容
3箩做、具體說(shuō)明見(jiàn)下面例子
package main
import (
"fmt"
"reflect"
"encoding/json"
"strings"
)
type Class struct {
Grade int `json:"grade"` //年級(jí)
ClassNumber int `json:"classNumber"` //班級(jí)號(hào)
}
type Student struct{
Name string //大寫(xiě)開(kāi)頭,可被導(dǎo)出妥畏,沒(méi)有`json:".."`邦邦,導(dǎo)出json的字段名是原本名稱(chēng)
age int //小寫(xiě)開(kāi)題,不可被導(dǎo)出
Hight int `json:"currentHight"` //導(dǎo)出對(duì)應(yīng)json的字段名為currentHight
Class *Class `class` //指針醉蚁,指向引用對(duì)象圃酵;如果不用指針,只是值復(fù)制
}
func doMarshal(){//對(duì)象轉(zhuǎn)json字符串
nClass:=new(Class)//new只給給特定類(lèi)型分配內(nèi)存馍管,設(shè)置“零”值郭赐,返回其地址(指針)
fmt.Printf("nClass的類(lèi)型是%s,內(nèi)容是%v\n",reflect.TypeOf(nClass),*nClass)
nClass.Grade=3
nClass.ClassNumber=6
nStudents:=make([]*Student,0)
//make只用于map,slice和channel确沸,并且不顯示返回指針
//這個(gè)切片捌锭,存放Student的指針
nStudent:=Student{"Lily",7,116,nClass}
jsonBytes,err1:=json.Marshal(nStudent)//解析后的是[]byte
if err1!=nil{
fmt.Printf("轉(zhuǎn)json失敗:%v\n",err1)
return
}
fmt.Println("轉(zhuǎn)成的JSON:") //age不會(huì)被導(dǎo)出
//{"Name":"Lily","currentHight":116,"Class":{"grade":3,"classNumber":6}}
fmt.Println(string(jsonBytes))
nStudents=append(nStudents,&Student{"Lilei",8,130,nClass})
nStudents=append(nStudents,&nStudent)
josnListBytes,err2:=json.Marshal(nStudents)
if err2!=nil{
fmt.Printf("轉(zhuǎn)jsonList失斅奚印:%v\n",err2)
return
}
fmt.Println("轉(zhuǎn)成的列表型JSON:")
fmt.Println(string(josnListBytes))
//[{"Name":"Lilei","currentHight":130,"Class":{"grade":3,"classNumber":6}},{"Name":"Lily","currentHight":116,"Class":{"grade":3,"classNumber":6}}]
}
func doUnMarshal(){//json字符串轉(zhuǎn)對(duì)象
jsonStr:=`
{
"Name":"Lily",
"currentHight":116,
"age":12,
"Class":{
"grade":3,
"classNumber":6
},
"score":[98,100,95]
}
`
jsonListStr:=`[
{
"Name":"Lucy",
"currentHight":120,
"Class":{
"grade":3,
"classNumber":5
}
},
{
"Name":"Lily",
"currentHight":116,
"Class":{
"grade":3,
"classNumber":6
}
}
]`
//第一種解析json方式观谦,解析到Struct/[]Struct
student:=Student{}//同new(Student)
err:=json.Unmarshal([]byte(jsonStr),&student)
//Unmarshall第2個(gè)參數(shù)必須是指針,否則報(bào)錯(cuò):json: Unmarshal(non-pointer main.Student)
//因?yàn)楸仨毥馕龅骄唧w的對(duì)象桨菜,所以需傳入對(duì)象引用豁状,而不是值傳遞
//score在Student中沒(méi)有此字段,所以被忽略了
if err!=nil{
fmt.Printf("解析json字符串異常:%s\n",err)
}
fmt.Printf("學(xué)生的名稱(chēng)是%v,班級(jí)信息是%v,年齡是%v(私有對(duì)象不能導(dǎo)入倒得,初始為0)\n",student.Name,*student.Class,student.age)
//學(xué)生的名稱(chēng)是Lily,學(xué)生的班級(jí)信息是{3 6},學(xué)生的年齡是0
students:=[]*Student{} //定義切片泻红,同make([]*Student,0)
err=json.Unmarshal([]byte(jsonListStr),&students)
if err!=nil{
fmt.Printf("解析json字符串異常:%s\n",err)
}
for _,stu:=range students{ //這里stu是指針類(lèi)型,獲取其屬性可以直接用.Name霞掺,也可以解引用后用.Name
fmt.Printf("列表:學(xué)生的名稱(chēng)是%s,身高是%d,在%d年級(jí)%d班\n",stu.Name,(*stu).Hight,(*stu.Class).Grade,stu.Class.ClassNumber)
}
//第二種解析到interface{}/[]interface{}
fmt.Println("*************解析json*************")
var student1 interface{}
err=json.Unmarshal([]byte(jsonStr),&student1)
if err!=nil{
fmt.Printf("解析json字符串異常:%s\n",err)
}
c:=-1
resolve2JosnObj(student1,c)
/*
*************解析json*************
map元素:
map[Name]的元素: 類(lèi)型是string谊路,值是 Lily
map[currentHight]的元素: 類(lèi)型float64,值是 116
map[age]的元素: 類(lèi)型float64菩彬,值是 12
map[Class]的元素: map元素:
---map[classNumber]的元素: 類(lèi)型float64缠劝,值是 6
---map[grade]的元素: 類(lèi)型float64潮梯,值是 3
map[score]的元素: list元素:
---第0個(gè)元素: 類(lèi)型float64,值是 98
---第1個(gè)元素: 類(lèi)型float64惨恭,值是 100
---第2個(gè)元素: 類(lèi)型float64秉馏,值是 95
*/
fmt.Println("*************解析jsonlist*************")
var students1 interface{}
err=json.Unmarshal([]byte(jsonListStr),&students1)
if err!=nil{
fmt.Printf("解析jsonlist字符串異常:%s\n",err)
}
d:=-1
resolve2JosnObj(students1,d)
/*
*************解析jsonlist*************
list元素:
第0個(gè)元素: map元素:
---map[Name]的元素: 類(lèi)型是string,值是 Lucy
---map[currentHight]的元素: 類(lèi)型float64脱羡,值是 120
---map[Class]的元素: map元素:
------map[grade]的元素: 類(lèi)型float64萝究,值是 3
------map[classNumber]的元素: 類(lèi)型float64,值是 5
第1個(gè)元素: map元素:
---map[Class]的元素: map元素:
------map[grade]的元素: 類(lèi)型float64轻黑,值是 3
------map[classNumber]的元素: 類(lèi)型float64糊肤,值是 6
---map[Name]的元素: 類(lèi)型是string琴昆,值是 Lily
---map[currentHight]的元素: 類(lèi)型float64氓鄙,值是 116
*/
}
func resolve2JosnObj(objI interface{},c int){
c=c+1
switch obj:=objI.(type) { //此處[interface{}].(type) 專(zhuān)門(mén)用于switch的類(lèi)型判斷
case string:
fmt.Println("類(lèi)型是string,值是",obj)
case float64:
fmt.Println("類(lèi)型float64业舍,值是",obj)
case map[string]interface{}:
fmt.Println("map元素:")
for k,vi:=range obj{
fmt.Printf("%smap[%s]的元素: ",strings.Repeat("---",c),k)
resolve2JosnObj(vi,c)
}
case []interface{}:
fmt.Println("list元素:")
for i,vi:=range obj{
fmt.Printf("%s第%d個(gè)元素: ",strings.Repeat("---",c),i)
resolve2JosnObj(vi,c)
}
default:
fmt.Println("無(wú)法判斷類(lèi)型抖拦,類(lèi)型是",reflect.TypeOf(obj),"值是",obj)
}
}
func main() {
doMarshal()//對(duì)象轉(zhuǎn)json字符串
doUnMarshal()
}