一、介绍
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,Go语言内置的JSON包提供了解析和生成JSON格式数据的函数。在API应用中,我们通常会从接口获取JSON格式的数据,然后使用相应的JSON处理函数解析数据后使用。
二、JSON的基本结构
JSON数据由键和值构成,键值对之间使用英文冒号(:
)分隔,多个键值对使用英文逗号(,
)分隔,JSON数据使用花括号({}
)包裹。一个JSON的例子如下:
{
"name": "张三",
"age": 20,
"gender": "male",
"hobbies": ["basketball", "music"]
}
1. JSON的数据类型
JSON支持以下数据类型:
字符串:由双引号("
)包裹的Unicode字符串,例如:"hello"
数字:整数或浮点数,例如:20, 3.14
布尔值:true或false
数组:由中括号([]
)包裹的一组值,值之间使用英文逗号(,
)分隔,例如:[1, 2, 3]
对象:由花括号({}
)包裹的一组键值对,键值对之间使用英文逗号(,
)分隔,例如:{"name": "张三", "age": 20}
null:表示空值,例如:null
2. JSON的解析
Go语言内置的JSON包提供了解析JSON数据的函数json.Unmarshal(data []byte, v interface{})
,其中:
data []byte
是需要解析的JSON数据。
v interface{}
是解析后的数据类型。
例如,我们要解析以下JSON数据:
{
"name": "张三",
"age": 20,
"gender": "male",
"hobbies": ["basketball", "music"]
}
可以定义一个结构体来表示JSON数据的格式:
type Person struct {
Name string `json:"name"`
Age int `json:"age"`
Gender string `json:"gender"`
Hobbies []string `json:"hobbies"`
}
然后将JSON数据解析成该结构体的实例,代码如下:
import (
"encoding/json"
"fmt"
)
func main() {
data := []byte(`{
"name": "张三",
"age": 20,
"gender": "male",
"hobbies": ["basketball", "music"]
}`)
var p Person
err := json.Unmarshal(data, &p)
if err != nil {
panic(err)
}
fmt.Println(p.Name, p.Age, p.Gender, p.Hobbies)
}
运行结果为:
张三 20 male [basketball music]
3. JSON的生成
Go语言内置的JSON包提供了生成JSON数据的函数json.Marshal(v interface{})
,其中v interface{}
是需要生成的数据类型。例如,我们要生成以下JSON数据:
{
"name": "李四",
"age": 25,
"gender": "female",
"hobbies": ["reading", "traveling"]
}
可以使用以下结构体来表示:
type Person struct {
Name string `json:"name"`
Age int `json:"age"`
Gender string `json:"gender"`
Hobbies []string `json:"hobbies"`
}
然后将该结构体的实例转换成JSON数据,代码如下:
import (
"encoding/json"
"fmt"
)
func main() {
var p Person
p.Name = "李四"
p.Age = 25
p.Gender = "female"
p.Hobbies = []string{"reading", "traveling"}
data, err := json.Marshal(p)
if err != nil {
panic(err)
}
fmt.Println(string(data))
}
运行结果为:
{
"name":"李四",
"age":25,
"gender":"female",
"hobbies":["reading","traveling"]
}
三、使用JSON解析API返回的数据
在API应用中,我们通常会从接口获取JSON格式的数据,然后使用相应的JSON处理函数解析数据后使用。以下是一个示例代码,从天气API接口获取数据并解析:
package main
import (
"encoding/json"
"fmt"
"io/ioutil"
"net/http"
)
type Weather struct {
City string `json:"city"`
Temperature float64 `json:"temp"`
}
func main() {
url := "https://api.openweathermap.org/data/2.5/weather?q=London,uk&appid=your_app_key"
resp, err := http.Get(url)
if err != nil {
panic(err)
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
panic(err)
}
var weatherData Weather
err = json.Unmarshal(body, &weatherData)
if err != nil {
panic(err)
}
fmt.Printf("The temperature in %s is %.2f degrees Celsius.\n", weatherData.City, weatherData.Temperature-273.15)
}
以上代码从OpenWeatherMap的API接口获取伦敦的天气数据,并解析返回的JSON数据,最后输出天气数据的城市和温度。运行结果为:
The temperature in London is 9.39 degrees Celsius.
1. API接口的基本格式
在API应用中,我们需要知道API接口的基本格式。一个API接口通常由以下几部分构成:
协议:通常是HTTP或HTTPS协议。
主机名:例如api.openweathermap.org。
URI路径:例如/data/2.5/weather。
查询参数:例如?q=London,uk&appid=your_app_key。
例如,OpenWeatherMap的API接口的格式为:
https://api.openweathermap.org/data/2.5/weather?q=London,uk&appid=your_app_key
2. 使用http包发送GET请求获取API数据
在使用Go语言访问API接口时,我们可以使用http包提供的http.Get(url string)
函数发送GET请求获取API数据。该函数使用指定的url字符串作为请求地址,并返回一个响应对象。
resp, err := http.Get(url)
if err != nil {
panic(err)
}
其中url
是API接口的地址字符串(包括协议、主机名、路径和查询参数)。
3. 获取响应数据
使用http包发送GET请求后,我们可以获取响应数据并保存到变量中,代码如下:
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
panic(err)
}
其中resp.Body
是响应对象的主体部分,使用ioutil包的ioutli.ReadAll(r io.Reader) []byte
函数读取主体部分的所有数据并保存到body []byte
变量中,注意该函数会自动关闭响应对象的主体部分。
4. 使用json包解析JSON数据
使用Go语言解析返回的JSON数据需要使用json包提供的json.Unmarshal(data []byte, v interface{})
函数。其中data []byte
是需要解析的JSON数据,v interface{}
是解析后的数据类型。
var weatherData Weather
err = json.Unmarshal(body, &weatherData)
if err != nil {
panic(err)
}
以上代码将body []byte
变量中的JSON数据解析成Weather
类型的结构体weatherData Weather
,注意Weather
结构体中需要使用json
标记来指定JSON数据中对应的键。
四、总结
Go语言内置的JSON包提供了解析和生成JSON格式数据的函数,使用这些函数我们可以方便地处理API接口返回的JSON数据。在使用API接口时,我们需要了解API接口的基本结构,使用http包发送GET请求获取API数据并使用json包解析JSON数据。