Json 处理 - golang

代码示例:

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++
			}
		}
	}
}

运行效果:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

余衫马

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值