## 一、结构体转JSON
~~~
package main
import (
"fmt"
"encoding/json"
)
// 结构体
type User3 struct {
Name string
Age int
}
func main() {
// 一、格式化方式一
u1 := User3{"aaa",18}
b,err:=json.Marshal(u1)
if err!=nil{
fmt.Println("json err",err)
}
fmt.Println(string(b))
// 二、格式化方式二
// 第二个参数。每行的前缀
// 第三个参数:每行的缩进格式
b,err=json.MarshalIndent(u1,""," ")
if err!=nil{
fmt.Println("json err",err)
}
fmt.Println(string(b))
}
~~~
运行结果:
{"Name":"aaa","Age":18}
{
"Name": "aaa",
"Age": 18
}
## 二、为结构体字段取别名
~~~
package main
import (
"fmt"
"encoding/json"
)
// 结构体
type User3 struct {
Name string `json:"name"`
Age int `json:"age"`
}
func main() {
// 一、格式化方式一
u1 := User3{"aaa",18}
b,err:=json.Marshal(u1)
if err!=nil{
fmt.Println("json err",err)
}
fmt.Println(string(b))
// 二、格式化方式二
// 第二个参数。每行的前缀
// 第三个参数:每行的缩进格式
b,err=json.MarshalIndent(u1,""," ")
if err!=nil{
fmt.Println("json err",err)
}
fmt.Println(string(b))
}
~~~
运行结果:
{"name":"aaa","age":18}
{
"name": "aaa",
"age": 18
}
## 三、map转化成Json
~~~
package main
import (
"fmt"
"encoding/json"
)
// 结构体
type User3 struct {
Name string `json:"name"`
Age int `json:"age"`
}
func main() {
maps := make(map[string]interface{})
maps["name"] = "aaa"
maps["age"] = 15
maps["sex"] = "男"
json,err := json.Marshal(maps)
if err!=nil{
fmt.Println("json err",err)
}
fmt.Println(string(json))
}
~~~
运行结果:
{"age":15,"name":"aaa","sex":"男"}
## 四、解码(解析到结构体)
~~~
package main
import (
"fmt"
"encoding/json"
)
// 结构体
type User3 struct {
Name string `json:"name"`
Age int `json:"age"`
}
func main() {
//创建json数据
b := []byte(`{"age":15,"name":"aaa"}`)
// 申明结构体
var u User3
//json解析到结构体
err :=json.Unmarshal(b,&u)
if err!=nil{
fmt.Println("json err",err)
}
fmt.Println(u)
}
~~~
运行结果:
{aaa 15}
## 五、解码(解析到interface)
~~~
package main
import (
"encoding/json"
"fmt"
)
func main() {
//1.创建json数据
b := []byte(`{"Name":"zhangsan","Hobby":"女"}`)
//2.声明空interface
var i interface{}
//3.解析
err := json.Unmarshal(b, &i)
if err != nil {
fmt.Println(err)
}
//默认转成了map
fmt.Println(i)
//4.解析到interface的json可以判断类型
m := i.(map[string]interface{})
for k, v := range m {
switch vv := v.(type) {
case string:
fmt.Println(k, "是string类型", vv)
case int:
fmt.Println(k, "是int类型", vv)
default:
fmt.Println("xxx")
}
}
}
~~~
- 一、数组
- 二、切片
- 三、copy
- 四、MAP
- 五、结构体
- 六、结构体参数
- 七、面向”对象“
- 1、匿名字段
- 2、方法
- 3、包和封装
- 4、接口
- 5、异常处理
- 八、Json
- 九、文件操作
- 1、写文件
- 2、读取文件内容
- 3、拷贝文件
- 十、反射
- 1、查看类型,字段和方法
- 2、查看匿名字段
- 3、修改基本类型的值
- 4、修改结构体的值
- 5、调用方法
- 十一、并发编程
- 1、并行和并发
- 2、协程
- 3、runtime包
- 5、channel的使用
- 6、close
- 7、定时器
- 8、select
- 9、协程同步锁
- 十二、socket编程
- 十三、Http编程
- 十四、并发爬虫和数据处理
- 1、简易爬虫实例
- 2、并发爬取图片
- 3、读文件中的数据
- 4、数据清洗
- 其他
- 1、推荐文章