大学网 > php中文网 > 后端开发Golang 响应解析:如何处理和转换 JSON 响应正文

Golang 响应解析:如何处理和转换 JSON 响应

中国大学网 2024-10-17

Golang 响应解析:如何处理和转换 JSON 响应

在 Go 应用程序中与 API 交互时,经常需要处理和转换 JSON 响应。本文将介绍解析 JSON 响应的两种常用方法,并提供一个实战案例。

使用第三方库

我们可以使用 encoding/json 标准库或流行的第三方库来解析 JSON 响应。以下是如何使用第三方库 [github.com/json-iterator/go](https://github.com/json-iterator/go) 来解析响应:

package main

import (
    "context"
    "fmt"
    "io/ioutil"
    "net/http"

    "github.com/json-iterator/go"
)

type User struct {
    ID        int    `json:"id"`
    Name      string `json:"name"`
    Email     string `json:"email"`
    CreatedAt string `json:"created_at"`
}

const apiURL = "https://jsonplaceholder.typicode.com/users"

func main() {
    resp, err := http.Get(apiURL)
    if err != nil {
        panic(err)
    }
    defer resp.Body.Close()

    // 读取响应体
    body, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        panic(err)
    }

    // 创建一个 json.Iterator 实例来解析响应
    var jsonIter = jsoniter.ConfigFastest.Froze(body)

    // 迭代遍历数组
    fmt.Println("Users:")
    var item jsoniter.Any
    for item.ToValid() {
        var user User
        if err := jsonIter.ToVal(&user); err != nil {
            panic(err)
        }
        fmt.Printf("- %+v\n", user)
        // 下一个元素
        item = item.Next()
    }
}

使用标准库

我们还可以使用 encoding/json 标准库来解析 JSON 响应:

package main

import (
    "bytes"
    "context"
    "encoding/json"
    "fmt"
    "io/ioutil"
    "net/http"
)

type User struct {
    ID        int    `json:"id"`
    Name      string `json:"name"`
    Email     string `json:"email"`
    CreatedAt string `json:"created_at"`
}

const apiURL = "https://jsonplaceholder.typicode.com/users"

func main() {
    resp, err := http.Get(apiURL)
    if err != nil {
        panic(err)
    }
    defer resp.Body.Close()

    // 读取响应体
    body, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        panic(err)
    }

    // 创建一个 json.Decoder 实例来解析响应
    decoder := json.NewDecoder(bytes.NewReader(body))

    // 解码 JSON 数组
    fmt.Println("Users:")
    for {
        var user User
        if err := decoder.Decode(&user); err != nil {
            if err == io.EOF {
                break
            }
            panic(err)
        }
        fmt.Printf("- %+v\n", user)
    }
}

实战案例

以上代码展示了如何解析 JSON 数组。在真实世界应用程序中,我们可能需要解析更复杂的 JSON 结构,例如嵌套对象或数组。我们还可以使用反射将 JSON 数据直接映射到自定义结构。

立即学习“go语言免费学习笔记(深入)”;

如何选择解析方法取决于具体场景和性能要求。第三方库通常提供更多的特性和更好的性能,而标准库的用法更简单。

以上就是Golang 响应解析:如何处理和转换 JSON 响应的详细内容,更多请关注中国大学网其它相关文章!