一、Http - client 获取json
参考:Go标准库http Client的连接行为控制详解-原创手记-慕课网
因为
代码
resp, err := http.Get("http://example.com/")
...
resp, err := http.Post("http://example.com/upload", "image/jpeg", &buf)
...
等价于如下代码:
client := &http.Client{} // 自定义一个http客户端实例
resp, err := client.Get("http://example.com/")
...
resp, err := client.Post("http://example.com/upload", "image/jpeg", &buf)
...
注:别忘了在Get或Post成功后,调用defer resp.Body.Close()。
所以
根据上述代码,进行改进完成如下代码
res, err := http.Get("http://xxxxxxx") //http网页自行准备
if err != nil {
// handle error
}
defer res.Body.Close()
body, err := ioutil.ReadAll(res.Body)
if err != nil {
// handle error
}
//这时 body为int类型需强转为string类型
body1 := string(body)
fmt.Println(body1)
我的http json结构如下
运行上述代码后,结果为
获取json 成功
二、解析JSON
...
body1 := string(body)
var res2 Result
errs := json.Unmarshal([]byte(body1), &res2)
if errs != nil {
fmt.Println("json unmarshal error:", errs)
}
获取到的json 通过json.Unmarshal进行解析 并存入 res2中。
因为我的json结构为
所以 需要进行两次data取值的操作
type Result struct {
Message string `json:"message"`
Code int `json:"code"`
D data `json:"data"`
}
type data struct {
Total int `json:"total"`
D1 data1 `json:"data"`
}
type data1 []struct {
Id int `json:"id"`
User int `json:"user"`
Username string `json:"username"`
}
使用如上定义后就可以取值
for i := 0; i < len(res2.D.D1); i++ {
fmt.Printf("%v\n", res2.D.D1[i].ID)
fmt.Printf("%v\n", res2.D.D1[i].User)
fmt.Printf("%v\n", res2.D.D1[i].Username)
}
三、创建sql库
create table jsontest (
Num int primary key not null auto_increment,
id int not null,
user int not null,
username varchar(20)
)
碰到情况:username 设置char后无法插入,改为varchar(20)后可顺利插入数据
用 auto_increment 设置自增 Num 方便后续查看表数据
四、连接数据库,将解析后的json插入数据库
import (
...
_ "github.com/go-sql-driver/mysql"
"github.com/jmoiron/sqlx"
)
var db *sqlx.DB // 是一个连接池对象
func initDB() (err error) {
//数据库信息
//用户名:密码@tcp(ip:端口)/数据库名
dsn := "root:xxx@tcp(192.xxx.xxx.xxx)/xxxx"
//连接数据库
db, err = sqlx.Connect("mysql", dsn) //不会校验用户名和密码是否正确
if err != nil { //dsn格式不正确的时候会报错
return
}
db.SetMaxOpenConns(10) //设置数据库连接池的最大连接数
db.SetMaxIdleConns(5) //设置最大空闲连接数
return
}
func main() {
...
err1 := initDB()
if err1 != nil {
fmt.Printf("init DB failed, err :%v\n", err)
return
}
for i := 0; i < len(res2.D.D1); i++ {
ID := res2.D.D1[i].Id
User := res2.D.D1[i].User
Username := res2.D.D1[i].Username
db.Exec(`insert into jsontest(id,user,username) values (?,?,?)`, ID, User, Username)
}
按照上述代码即可完成插入数据的操作,运行后到数据库中查看结果
插入成功!
接入数据库我使用的是sqlx进行操作。
五、sqlx注意事项
安装sqlx
go get github.com/jmoiron/sqlx
查询
查询单行
查询单条语句就用 db.Get
sqlStr1 := `select id, name, age from sqlxtest where id=1`
var u user
db.Get(&u, sqlStr1)
fmt.Printf("u:%#v\n", u)
查询多行
查询多条语句用 db.select
var userList = make([]user, 0, 10)
sqlStr2 := `select id,name, age from sqlxtest`
err = db.Select(&userList, sqlStr2)
if err != nil {
fmt.Printf("select faile, err:%v\n", err)
return
}
fmt.Printf("userList:%#v\n", userList)
插入、更新和删除
均使用 db.Exec
插入
db.Exec(`insert into sqlxtest(id,name,age) values (?,?,?)`, id, name, age)
删除
db.Exec(`delete from sqlxtest where id = ?`, id)
更新
db.Exec(`update sqlxtest set age = ? where id = ?`, age, id)