Как преобразовать массив json и распаковать его с помощью golang - PullRequest
0 голосов
/ 15 января 2020

У меня есть это 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
}

Мне нужно "unmarshal" в go, с правильной структурой. Я пытался на многих сайтах преобразовать это в структуру, но когда я "unmarshal", возвращает nil.

Что такое структура правильного формата и как я "unmarshal" в этой структуре.

Мне нужен пример, как правильно "unmarshal". Tks !!

Ответы [ 2 ]

0 голосов
/ 16 января 2020

Прежде всего, я ценю вашу помощь. Мой код просто для получения результата этого 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, но у меня нет разрешения публиковать переменную токена носителя. Вы можете объяснить с помощью другого publi c 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)

}

Возвращение!

Большое вам спасибо!

0 голосов
/ 16 января 2020

Я использую некоторые примеры API-интерфейсов для демонстрации примера.

Приведенный ниже фиктивный API-интерфейс используется для получения списка сотрудников и анализа

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

enter image description here

с использованием https://mholt.github.io/json-to-go/ для создания структуры из JSON

enter image description here

и посмотрите код, который я протестировал и работает для меня. Поскольку AutoGenerated имеет массив данных внутри, используйте var data AutoGenerated для 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
}
...