永久免费的网站空间,青岛网站建设方案托管,网站做动态图片,020网站开发多少钱关于 JSON 数据 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。易于人阅读和编写。同时也 易于机器解析和生成。RESTfull Api 接口中返回的数据都是 json 数据。 Json 的基本格式如下#xff1a; {
a: Hello,
b: {
a: Hello,
b: World
} 稍微复杂点的 JSON 结构体与 JSON 序列化 注意一个点结构体内的私有属性不能被json包访问如果结构体内部的属性都要就行转换需要全部为公有属性开头字符大写 比如我们 Golang 要给 App 或者小程序提供 Api 接口数据这个时候就需要涉及到结构体和 Json 之间的相互转换。 Golang JSON 序列化 是指把结构体数据转化成 JSON 格式的字符串 结构体 ---- JSON格式字符串 Golang JSON 的反序列化 是指把 JSON 数据转化成 Golang 中的结构体对象。 JSON格式字符串 ---- 结构体 Golang 中 的 序 列 化 和 反 序 列 化 主 要 通 过 encoding/json 包 中 的 json.Marshal() 和json.Unmarshal()方法实现
结构体对象转化成 Json 字符串 package mainimport (encoding/jsonfmt
)type Person struct{Name stringGender stringAge int
}func main() {var p1 Person{Name: 奥特曼,Gender: 男,Age: 17,}fmt.Printf(%#v\n,p1)jsonByte,_ : json.Marshal(p1)jsonStr : string(jsonByte)fmt.Printf(%#v, jsonStr)}错误案例如下
package mainimport (encoding/jsonfmt
)type Person struct{Name stringGender stringage int
}func main() {var p1 Person{Name: 奥特曼,Gender: 男,age: 17,}fmt.Printf(%#v\n,p1)jsonByte,_ : json.Marshal(p1)jsonStr : string(jsonByte)fmt.Printf(%#v, jsonStr)}Json 字符串转换成结构体对象 返回一个err 如果err为空转换成功 err非空转换失败 package mainimport (encoding/jsonfmt
)type Person struct{Name stringGender stringage int
}func main() {var str {Name:奥特曼,Gender:男,Age:17}var p2 Personerr : json.Unmarshal([]byte(str), p2)if err ! nil { fmt.Println(err)}fmt.Printf(%#v\n, p2)fmt.Println(p2.Name)}结构体标签 Tag Tag 是结构体的元信息可以在运行的时候通过反射的机制读取出来。 Tag 在结构体字段的后方定义由一对反引号包裹起来具体的格式如下 key1:value1 key2:value2 结构体 tag 由一个或多个键值对组成。键与值使用冒号分隔值用双引号括起来。 同一个结构体字段可以设置多个键值对 tag不同的键值对之间使用空格分隔。 注意事项 为结构体编写 Tag 时必须严格遵守键值对的规则。 结构体标签的解析代码的容错能力很差一旦格式写错编译和运行时都不会提示任何错误通过反射也无法正确取值。 例如不要在 key 和 value 之间添加空格。 通过指定 tag 实现 json 序列化该字段时的 key 嵌套结构体和 JSON 序列化反序列化
package mainimport (encoding/jsonfmt
)
type Person struct{Name string json:nameGender string json:genderAge int json:age
}type Group struct{Intrasting stringPerson []Person
}
func main() {h : Group{Intrasting: 绘画,Person: make([]Person, 0),}for i : 17; i 20; i {p : Person{Name :fmt.Sprintf(编号%v, i), //字符串类型Gender:男,Age : i1,}h.Person append(h.Person, p) //将P里的东西添加到实例化的h后的切片内}// fmt.Println(c)strByte, err : json.Marshal(h)if err ! nil {fmt.Println(err)} else {strJson : string(strByte)fmt.Println(strJson)}
}逆序退回
package mainimport (encoding/jsonfmt
)type Person struct{Name string json:nameGender string json:genderAge int json:age
}type Group struct{Intrasting stringPerson []Person
}func main() {jsonStr : {Intrasting:绘画,Person:[{name:编号17,gender:男,age:18},{name:编号18,gender:男,age:19},{name:编号19,gender:男,age:20}]}var h Group{}err : json.Unmarshal([]byte(jsonStr), h)if err ! nil {fmt.Println(err)} else {fmt.Printf(%#v\n, h)fmt.Printf(%v, h.Intrasting)}
}