簡體   English   中英

如何轉換json數組並使用golang對其進行解組

[英]How to convert json array and unmarshal it with golang

我有這個json:

{
    "data": [
        {
            "id": 683,
            "nome": "Premier League 19/20",
            "nomeDaTaca": "Premier League",
            "temporada": "2019/2020",
            "categoria": "NACIONAL",
            "temClassificacao": true,
            "temClassificacaoPorGrupo": false,
            "tipoDeColeta": "ESTATISTICA_TOTAL",
            "faseAtual": "Primeira Fase",
            "quantidadeDeEquipes": "20",
            "rodadaAtual": 22,
            "quantidadeDeRodadas": 38,
            "urlLogo": "https://s3-sa-east-1.amazonaws.com/logos.footstast.net/campeonatos/Ingles.png",
            "pais": null,
            "sde": {
                "campeonato_id": null,
                "edicao_id": null
            }
        }
    ],
    "pagination": null
}

我需要使用正確的結構在 go 中“解組”。 我嘗試在許多站點上將其轉換為結構體,但是當我“解組”時,返回 nil。

什么是正確格式的結構以及我如何“解組”到這個結構中。

我需要一個示例如何正確地“解組”。 太棒了!!

我正在使用一些在線示例 API 來展示示例。

下面的虛擬 API 用於獲取員工列表並解析

http://dummy.restapiexample.com/api/v1/employees

在此處輸入圖片說明

使用https://mholt.github.io/json-to-go/從 JSON 生成結構

在此處輸入圖片說明

並查看我已經測試過並為我工作的代碼。 由於 AutoGenerated 有一個 Data 數組,使用var data AutoGenerated for Unmarshal 您可以使用data.Data來獲取數組。

package main

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

func main() {

    type AutoGenerated struct {
        Status string `json:"status"`
        Data   []struct {
            ID             string `json:"id"`
            EmployeeName   string `json:"employee_name"`
            EmployeeSalary string `json:"employee_salary"`
            EmployeeAge    string `json:"employee_age"`
            ProfileImage   string `json:"profile_image"`
        } `json:"data"`
    }
    url := "http://dummy.restapiexample.com/api/v1/employees"
    req, err := http.NewRequest("GET", url, nil)
    client := &http.Client{}
    res, err := client.Do(req)
    if err != nil {
        log.Println("Error on response.\n[ERRO] -", err)
    }
    body, _ := ioutil.ReadAll(res.Body)
    var data AutoGenerated

    json.Unmarshal([]byte(body), &data)

    fmt.Println(data)
}

除此之外,如果您不知道所有預期的鍵值對作為響應

您可以使用以下函數將任何 JSON 數組轉換為 Map 數組,以便在 golang 中輕松迭代或使用

func stringToMap(data string) []map[string]interface{} {

   var value []map[string]interface{}

   err := json.Unmarshal([]byte(data), &value)

   if err != nil {
      panic(err)
   }
   return value
}

首先,我感謝您的幫助。 我的代碼只是為了獲取這個 json 的結果(來自 Restfull API)。

然后我必須反序列化這些數據以將其保存在數據庫中。

我的難點是理解返回 json 結構,其中包含一個頂部數組。

像這樣:

{
    "data": [
        {
            "id": 683,
            "nome": "Premier League 19/20",

我的結構:(我使用https://mholt.github.io/json-to-go/ )為我轉換!

type Campeonato struct {
    Data []struct {
        ID                       int         `json:"id"`
        Nome                     string      `json:"nome"`
        NomeDaTaca               string      `json:"nomeDaTaca"`
        Temporada                string      `json:"temporada"`
        Categoria                string      `json:"categoria"`
        TemClassificacao         bool        `json:"temClassificacao"`
        TemClassificacaoPorGrupo bool        `json:"temClassificacaoPorGrupo"`
        TipoDeColeta             string      `json:"tipoDeColeta"`
        FaseAtual                string      `json:"faseAtual"`
        QuantidadeDeEquipes      string      `json:"quantidadeDeEquipes"`
        RodadaAtual              int         `json:"rodadaAtual"`
        QuantidadeDeRodadas      int         `json:"quantidadeDeRodadas"`
        URLLogo                  string      `json:"urlLogo"`
        Pais                     interface{} `json:"pais"`
        Sde                      struct {
            CampeonatoID interface{} `json:"campeonato_id"`
            EdicaoID     interface{} `json:"edicao_id"`
        } `json:"sde"`
    } `json:"data"`
    Pagination interface{} `json:"pagination"`
}

我要解組的代碼:它使用 API,但我無權發布不記名令牌變量。 您可以使用另一個公共 API 作為示例進行說明嗎?

func main() {

    url := "http://apifutebol.footstats.net/3.0/campeonatos"

    var bearer = " - I don't have permission to publicate it - "

    req, err := http.NewRequest("GET", url, nil)
    req.Header.Add("Authorization", bearer)

    client := &http.Client{}
    resp, err := client.Do(req)

    if err != nil {
        log.Println("Error on response.\n[ERRO] -", err)
    }

    body, _ := ioutil.ReadAll(resp.Body)
    //fmt.Println(string([]byte(body)))

    var data []Campeonato

    json.Unmarshal([]byte(body), &data)

}

回報是!

非常感謝!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM