代码示例:
package main
import (
"encoding/csv"
"encoding/json"
"fmt"
"os"
"strings"
"time"
"github.com/buger/jsonparser"
"github.com/kirinlabs/HttpRequest"
)
type Book struct {
Name string `json:"name"`
Author string `json:"author"`
}
func main() {
TestJson()
}
func TestJson() {
var testJson = []byte(`{
"book":[{
"name":"《Go微服务实战》",
"author":"刘金亮"
},{
"name":"《生活中的数学》",
"author":"杨峰,吴波"
}],
"fakeBook":{
"name":"《6o微服务实战》",
"author":"饼夕夕"
}
}`)
fmt.Println("jsonparser.Get", time.Now())
// 采用第三方包 github.com/buger/jsonparser
value, vt, offset, err := jsonparser.Get(testJson, "book")
fmt.Println("----- github.com/buger/jsonparser -----")
fmt.Println(string(value), vt, offset, err)
fmt.Println("encoding/json", time.Now())
// 原生反序列化包 encoding/json
var book map[string][]Book
err = json.Unmarshal([]byte(testJson), &book)
fmt.Println("----- encoding/json -----")
for i := 0; i < len(book); i++ {
fmt.Println(book["book"][i].Name, book["book"][i].Author)
}
fmt.Println("encoding/json", time.Now())
var fakeBook map[string]interface{}
err = json.Unmarshal([]byte(testJson), &fakeBook)
fmt.Println(fakeBook["book"])
fmt.Println(fakeBook["fakeBook"])
fmt.Println("encoding/json", time.Now())
}
运行结果:
jsonparser.Get 2021-09-01 13:41:41.4998616 +0800 CST m=+0.004991501
----- github.com/buger/jsonparser -----
[{
"name":"《Go微服务实战》",
"author":"刘金亮"
},{
"name":"《生活中的数学》",
"author":"杨峰,吴波"
}] array 155 <nil>
encoding/json 2021-09-01 13:41:41.5247505 +0800 CST m=+0.029880401
----- encoding/json -----
《Go微服务实战》 刘金亮
《生活中的数学》 杨峰,吴波
encoding/json 2021-09-01 13:41:41.5259333 +0800 CST m=+0.031063201
[map[author:刘金亮 name:《Go微服务实战》] map[author:杨峰,吴波 name:《生活中的数学》]]
map[author:饼夕夕 name:《6o微服务实战》]
encoding/json 2021-09-01 13:41:41.5264991 +0800 CST m=+0.031629001
简单应用:将 json 数据转存为 csv 文件
package main
import (
"encoding/csv"
"encoding/json"
"fmt"
"os"
"strings"
"time"
"github.com/buger/jsonparser"
"github.com/kirinlabs/HttpRequest"
)
const URL = "https://restapi.amap.com/v5/place/text"
var keywords = []string{"湖北省", "武汉市", "黄石市", "十堰市", "宜昌市", "襄阳市", "鄂州市", "荆门市", "孝感市", "荆州市", "黄冈市", "咸宁市", "随州市", "恩施州"}
var Parameters = map[string]interface{}{
"key": "高德地图开放平台账号申请的key",
"keywords": "武汉市",
//"types": "120000", // 120000(商务住宅)150000(交通设施服务)
"page_size": "25",
"page_num": "1",
}
type PositionData struct {
Name string `json:"name"`
Id string `json:"id"`
Location string `json:"location"`
Type string `json:"type"`
Typecode string `json:"typecode"`
Pname string `json:"pname"`
Cityname string `json:"cityname"`
Adname string `json:"adname"`
Address string `json:"address"`
Pcode string `json:"pcode"`
Citycode string `json:"citycode"`
Adcode string `json:"adcode"`
}
var counter = 1
var CsvHeader = []string{
"序号", "地址信息主键", "详细地址", "经度", "纬度",
}
func main() {
SaveToCsv()
}
// 爬虫
func Spider(pageNum int, keyword string) []byte {
req := HttpRequest.NewRequest()
// 设置页码
Parameters["page_num"] = pageNum
Parameters["keywords"] = keyword
// 设置请求参数
res, _ := req.Get(URL, Parameters)
// 导出 json 格式数据
b, _ := res.Export()
return []byte(b)
}
func SaveToCsv() {
// 创建 csv 文件
file, _ := os.Create("地址信息模拟数据-采自高德地图.csv")
defer file.Close()
// 写入UTF-8 BOM,防止中文乱码
file.WriteString("\xEF\xBB\xBF")
writer := csv.NewWriter(file)
defer writer.Flush()
// Write CSV header
writer.Write(CsvHeader)
// 循环写入数据
for j := 0; j < len(keywords); j++ {
for i := 0; i < 3; i++ {
data := Spider(i+1, keywords[j])
// 定位目标数据
content, _, _, err := jsonparser.Get(data, "pois")
if err != nil {
fmt.Println(err)
}
// 反序列化为结构体数组
var locaArry []map[string]string
err = json.Unmarshal([]byte(content), &locaArry)
if err != nil {
fmt.Println(err)
}
// 遍历数组,将所需数据写入 csv 文件
for _, v := range locaArry {
var targetData []string
// 序号
targetData = append(targetData, fmt.Sprintf("%d", counter))
// 主键
targetData = append(targetData, v["id"])
// 详细地址
detail := v["pname"] + v["cityname"] + v["adname"] + v["name"]
targetData = append(targetData, detail)
// 经纬度
s := strings.Split(v["location"], ",")
targetData = append(targetData, s...)
// 写入文件
writer.Write(targetData)
// 计数器加一
counter++
}
}
}
}
运行效果: