go json解析

Table of Contents

    由于go是静态强类型语言,不像JavaScript那样是动态语言,所以解析json的时候要先定义好解析后的结构体。

    以获取豆瓣电影信息接口为例,地址如下:

    http://api.douban.com/v2/movie/top250?start=0&count=2
    

    应答结果:

    {
    	"count": 2,
    	"start": 0,
    	"total": 250,
    	"subjects": [{
    		"rating": {
    			"max": 10,
    			"average": 9.6,
    			"stars": "50",
    			"min": 0
    		},
    		"genres": ["\u72af\u7f6a", "\u5267\u60c5"],
    		"title": "\u8096\u7533\u514b\u7684\u6551\u8d4e",
    		"casts": [{
    			"alt": "https:\/\/movie.douban.com\/celebrity\/1054521\/",
    			"avatars": {
    				"small": "http://img1.doubanio.com\/view\/celebrity\/s_ratio_celebrity\/public\/p17525.webp",
    				"large": "http://img1.doubanio.com\/view\/celebrity\/s_ratio_celebrity\/public\/p17525.webp",
    				"medium": "http://img1.doubanio.com\/view\/celebrity\/s_ratio_celebrity\/public\/p17525.webp"
    			},
    			"name": "\u8482\u59c6\u00b7\u7f57\u5bbe\u65af",
    			"id": "1054521"
    		}, {
    			"alt": "https:\/\/movie.douban.com\/celebrity\/1054534\/",
    			"avatars": {
    				"small": "http://img1.doubanio.com\/view\/celebrity\/s_ratio_celebrity\/public\/p34642.webp",
    				"large": "http://img1.doubanio.com\/view\/celebrity\/s_ratio_celebrity\/public\/p34642.webp",
    				"medium": "http://img1.doubanio.com\/view\/celebrity\/s_ratio_celebrity\/public\/p34642.webp"
    			},
    			"name": "\u6469\u6839\u00b7\u5f17\u91cc\u66fc",
    			"id": "1054534"
    		}, {
    			"alt": "https:\/\/movie.douban.com\/celebrity\/1041179\/",
    			"avatars": {
    				"small": "http://img3.doubanio.com\/view\/celebrity\/s_ratio_celebrity\/public\/p5837.webp",
    				"large": "http://img3.doubanio.com\/view\/celebrity\/s_ratio_celebrity\/public\/p5837.webp",
    				"medium": "http://img3.doubanio.com\/view\/celebrity\/s_ratio_celebrity\/public\/p5837.webp"
    			},
    			"name": "\u9c8d\u52c3\u00b7\u5188\u987f",
    			"id": "1041179"
    		}],
    		"collect_count": 1819454,
    		"original_title": "The Shawshank Redemption",
    		"subtype": "movie",
    		"directors": [{
    			"alt": "https:\/\/movie.douban.com\/celebrity\/1047973\/",
    			"avatars": {
    				"small": "http://img1.doubanio.com\/view\/celebrity\/s_ratio_celebrity\/public\/p230.webp",
    				"large": "http://img1.doubanio.com\/view\/celebrity\/s_ratio_celebrity\/public\/p230.webp",
    				"medium": "http://img1.doubanio.com\/view\/celebrity\/s_ratio_celebrity\/public\/p230.webp"
    			},
    			"name": "\u5f17\u5170\u514b\u00b7\u5fb7\u62c9\u90a6\u7279",
    			"id": "1047973"
    		}],
    		"year": "1994",
    		"images": {
    			"small": "http://img1.doubanio.com\/view\/photo\/s_ratio_poster\/public\/p480747492.webp",
    			"large": "http://img1.doubanio.com\/view\/photo\/s_ratio_poster\/public\/p480747492.webp",
    			"medium": "http://img1.doubanio.com\/view\/photo\/s_ratio_poster\/public\/p480747492.webp"
    		},
    		"alt": "https:\/\/movie.douban.com\/subject\/1292052\/",
    		"id": "1292052"
    	}, {
    		"rating": {
    			"max": 10,
    			"average": 9.6,
    			"stars": "50",
    			"min": 0
    		},
    		"genres": ["\u5267\u60c5", "\u7231\u60c5", "\u540c\u6027"],
    		"title": "\u9738\u738b\u522b\u59ec",
    		"casts": [{
    			"alt": "https:\/\/movie.douban.com\/celebrity\/1003494\/",
    			"avatars": {
    				"small": "http://img3.doubanio.com\/view\/celebrity\/s_ratio_celebrity\/public\/p67.webp",
    				"large": "http://img3.doubanio.com\/view\/celebrity\/s_ratio_celebrity\/public\/p67.webp",
    				"medium": "http://img3.doubanio.com\/view\/celebrity\/s_ratio_celebrity\/public\/p67.webp"
    			},
    			"name": "\u5f20\u56fd\u8363",
    			"id": "1003494"
    		}, {
    			"alt": "https:\/\/movie.douban.com\/celebrity\/1050265\/",
    			"avatars": {
    				"small": "http://img1.doubanio.com\/view\/celebrity\/s_ratio_celebrity\/public\/p46345.webp",
    				"large": "http://img1.doubanio.com\/view\/celebrity\/s_ratio_celebrity\/public\/p46345.webp",
    				"medium": "http://img1.doubanio.com\/view\/celebrity\/s_ratio_celebrity\/public\/p46345.webp"
    			},
    			"name": "\u5f20\u4e30\u6bc5",
    			"id": "1050265"
    		}, {
    			"alt": "https:\/\/movie.douban.com\/celebrity\/1035641\/",
    			"avatars": {
    				"small": "http://img3.doubanio.com\/view\/celebrity\/s_ratio_celebrity\/public\/p1399268395.47.webp",
    				"large": "http://img3.doubanio.com\/view\/celebrity\/s_ratio_celebrity\/public\/p1399268395.47.webp",
    				"medium": "http://img3.doubanio.com\/view\/celebrity\/s_ratio_celebrity\/public\/p1399268395.47.webp"
    			},
    			"name": "\u5de9\u4fd0",
    			"id": "1035641"
    		}],
    		"collect_count": 1463014,
    		"original_title": "\u9738\u738b\u522b\u59ec",
    		"subtype": "movie",
    		"directors": [{
    			"alt": "https:\/\/movie.douban.com\/celebrity\/1023040\/",
    			"avatars": {
    				"small": "http://img1.doubanio.com\/view\/celebrity\/s_ratio_celebrity\/public\/p1451727734.81.webp",
    				"large": "http://img1.doubanio.com\/view\/celebrity\/s_ratio_celebrity\/public\/p1451727734.81.webp",
    				"medium": "http://img1.doubanio.com\/view\/celebrity\/s_ratio_celebrity\/public\/p1451727734.81.webp"
    			},
    			"name": "\u9648\u51ef\u6b4c",
    			"id": "1023040"
    		}],
    		"year": "1993",
    		"images": {
    			"small": "http://img1.doubanio.com\/view\/photo\/s_ratio_poster\/public\/p1910813120.webp",
    			"large": "http://img1.doubanio.com\/view\/photo\/s_ratio_poster\/public\/p1910813120.webp",
    			"medium": "http://img1.doubanio.com\/view\/photo\/s_ratio_poster\/public\/p1910813120.webp"
    		},
    		"alt": "https:\/\/movie.douban.com\/subject\/1291546\/",
    		"id": "1291546"
    	}],
    	"title": "\u8c46\u74e3\u7535\u5f71Top250"
    }
    

    为了解析上面的json字符串,定义结构如下:

    type (
    	Response struct {
    		Count   int `json:"count"`
    		Start   int `json:"start"`
    		Total   int `json:"total"`
    		Subject []struct {
    			Rating struct {
    				Max     int     `json:"max"`
    				Average float32 `json:"average"`
    				Stars   string  `json:"stars"`
    				Min     int     `json:"min"`
    			} `json:"rating"`
    			Genres []string `json:"genres"`
    			Title  string   `json:"title"`
    			Casts  []struct {
    				Alt     string `json:"alt"`
    				Avatars struct {
    					Small  string `json:"small"`
    					Large  string `json:"large"`
    					Medium string `json:"medium"`
    				} `json:"avatars"`
    			} `json:"casts"`
    		} `json:"subjects"`
    		Title string `json:"title"`
    	}
    )
    
    

    可以看出跟应答字符串里的json格式是对应的,Response是整个应答结果的类型名,里面才是具体的字段,定义的时候一定要注意字段类型不能随便填。

    完整代码如下:

    package main
    
    import (
    	"encoding/json"
    	"log"
    	"net/http"
    )
    
    type (
    	Response struct {
    		Count   int `json:"count"`
    		Start   int `json:"start"`
    		Total   int `json:"total"`
    		Subject []struct {
    			Rating struct {
    				Max     int     `json:"max"`
    				Average float32 `json:"average"`
    				Stars   string  `json:"stars"`
    				Min     int     `json:"min"`
    			} `json:"rating"`
    			Genres []string `json:"genres"`
    			Title  string   `json:"title"`
    			Casts  []struct {
    				Alt     string `json:"alt"`
    				Avatars struct {
    					Small  string `json:"small"`
    					Large  string `json:"large"`
    					Medium string `json:"medium"`
    				} `json:"avatars"`
    			} `json:"casts"`
    		} `json:"subjects"`
    		Title string `json:"title"`
    	}
    )
    
    func main() {
    	uri := "http://api.douban.com/v2/movie/top250?start=0&count=2"
    	resp, err := http.Get(uri)
    	if err != nil {
    		log.Println("ERROR", err)
    		return
    	}
    	defer resp.Body.Close()
    	var res Response
    	err = json.NewDecoder(resp.Body).Decode(&res)
    	if err != nil {
    		log.Println("ERROR", err)
    		return
    	}
        log.Println(res)
    	log.Println(res.Subject[0].Rating)
    }
    
    

    log.Println(res.Subject[0].Rating) 仅打印制定的字段,使用类似的方式获取自己想要的字段的值

    上一篇文章

    下一篇文章