【Go】(八)Go基础 -- Json

JSON

json格式就不再赘述了,直接看看go json常用的方法

标准库encoding/json

标准库json的序列化和反序列化可以通过两种函数

  • json.Marshal和json.Unmarshal([]byte 和json互转)
  • decode返回的是steam(steam和json互转)

json.Marshal和json.Unmarshal

  • 序列化使用Marshal,反序列化使用UnMarshal
  • 使用Marshal的时候,结构体必须是可导出的(成员首字母大写)
  • 可以使用标签进行相关操作
package main

import (
	"encoding/json"
	"fmt"
	"log"
)

type Movie struct {
	Title string
	Year  int  `json:"released"`
	Color bool `json:"color,omitempty"`
}

func main() {

	movies := []Movie{
		{"title1", 2000, true},
		{"title2", 2001, true},
		{"title3", 2002, false},
	}

	data, err := json.Marshal(movies)
	if err != nil {
		fmt.Println(err)
	}
	fmt.Printf("%s\n", data)
	// [{"Title":"title1","released":2000,"color":true},{"Title":"title2","released":2001,"color":true},{"Title":"title3","released":2002}]

	dataIndent, err := json.MarshalIndent(movies, "", "    ")
	if err != nil {
		fmt.Println(err)
	}
	fmt.Printf("%s\n", dataIndent)
	//[
	//    {
	//        "Title": "title1",
	//        "released": 2000,
	//        "color": true
	//    },
	//    {
	//        "Title": "title2",
	//        "released": 2001,
	//        "color": true
	//    },
	//    {
	//        "Title": "title3",
	//        "released": 2002
	//    }
	//]
	var m []Movie
	if err := json.Unmarshal(data, &m); err != nil {
		log.Fatalln(err)
	}
	fmt.Printf("%v", m)
	// [{title1 2000 true} {title2 2001 true} {title3 2002 false}]
}

json标签选项

  • -:不进行序列化
  • omitempy:零值或空值得时候,不对该字段进行序列化
  • Type:重新指定字段类型:json:“age,string”

json.Decode和json.Undecode

type IssueResult struct {
	TotalCount int `json:"total_count"`
	Items      []*Issue
}
type Issue struct {
	Number  int
	HTMLURL string `json:"html_url"`
	Title   string
	User    *User
}

type User struct {
	Login   string
	HTMLURL string `json:"html_url"`
}

const IssueURL = "https://api.github.com/search/issues"

func main() {

	result, err := SearchIssues([]string{"repo:golang/go"})
	if err != nil {
		fmt.Println("error")
	}
	fmt.Printf("%d issues: \n", result.TotalCount)
	for _, item := range result.Items {
		fmt.Printf("#%-5d %9.9s %.55s\n", item.Number, item.User.Login, item.Title)
	}

}

func SearchIssues(terms []string) (*IssueResult, error) {
	q := url.QueryEscape(strings.Join(terms, ""))
	resp, err := http.Get(IssueURL + "?q=" + q)
	if err != nil {
		return nil, err
	}
	if resp.StatusCode != http.StatusOK {
		resp.Body.Close()
		return nil, fmt.Errorf("error")
	}
	var result IssueResult
	if err := json.NewDecoder(resp.Body).Decode(&result); err != nil {
		resp.Body.Close()
		return nil, err
	}
	resp.Body.Close()
	return &result, nil
}

Refs

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值