Массивы JSON как структуры Go

Я пытаюсь вызвать массив объектов из моего файла JSON, но всегда сталкиваюсь с ошибкой, говорящей: «не удается преобразовать массив в значение Go типа config.APPConfig». Как я могу убедиться, что конфигурации, как моя структура Go вызывает массив объектов в моем файле JSON? Вот мой файл конфигурации, в котором я настроил структуры Go, и файл JSON:

config.go

      package config

import (
 "encoding/json"
 "io/ioutil"
)

type Easy struct {
 UID string `json:"uId"`
}

type Auth struct {
 Code string `json:"code"`
}

type APPConfig struct {
 OpenAPIMode string `json:"openAPIMode"` 
 OpenAPIURL  string `json:"openAPIUrl"`  

 ClientID string `json:"clientId"` 
 Secret   string `json:"secret"` 

 AuthMode string `json:"authMode"`

 Easy Easy `json:"easy"`
 Auth Auth `json:"auth"`

 DeviceID string `json:"deviceId"`

 UID          string `json:"-"` 
 MQTTUID      string `json:"-"` 
 AccessToken  string `json:"-"`
 RefreshToken string `json:"-"`
 ExpireTime   int64  `json:"-"`
}

var App = APPConfig{
  OpenAPIMode: "mqtt",
  OpenAPIURL:  "openapi.tuyacn.com",
}


func LoadConfig() error {
  return parseJSON("webrtc.json", &App)
}

func parseJSON(path string, v interface{}) error {
  data, err := ioutil.ReadFile(path)
  if err != nil {
    return err
}

 err = json.Unmarshal(data, v)
 return err
}

JSON-файл

      [
  {
    "openAPIMode": "mqtt",
    "openAPIUrl": "openapi.tuyaus.com",
    "clientId": "*****",
    "secret": "**************",
    "authMode": "easy",
    "easy": {
      "uId": "**********"
    },
    "auth": {
      "code": ""
    },
    "deviceId": "***********"
  },
  {
    "openAPIMode": "mqtt",
    "openAPIUrl": "openapi.tuyaus.com",
    "clientId": "*****",
    "secret": "**************",
    "authMode": "easy",
    "easy": {
      "uId": "**********"
    },
    "auth": {
      "code": ""
    },
    "deviceId": "***********"
  }
]

Заранее спасибо за помощь!

1 ответ

Ваш файл конфигурации json представляет собой массив JSON, и вы анализируете его для структуры, которую вам нужно проанализировать для массива структуры.

Чтобы исправить ваш код, измените инициализациюAppк этому.

      var App []APPConfig

func LoadConfig() error {
    return parseJSON("webrtc.json", &App)
}

Вот пример полного кода для него.

      package main

import (
    "encoding/json"
    "fmt"
    "io/ioutil"
)

type Easy struct {
    UID string `json:"uId"`
}

type Auth struct {
    Code string `json:"code"`
}

type APPConfig struct {
    OpenAPIMode string `json:"openAPIMode"`
    OpenAPIURL  string `json:"openAPIUrl"`

    ClientID string `json:"clientId"`
    Secret   string `json:"secret"`

    AuthMode string `json:"authMode"`

    Easy Easy `json:"easy"`
    Auth Auth `json:"auth"`

    DeviceID string `json:"deviceId"`

    UID          string `json:"-"`
    MQTTUID      string `json:"-"`
    AccessToken  string `json:"-"`
    RefreshToken string `json:"-"`
    ExpireTime   int64  `json:"-"`
}

var App []APPConfig

func LoadConfig() error {
    return parseJSON("webrtc.json", &App)
}

func parseJSON(path string, v interface{}) error {
    data, err := ioutil.ReadFile(path)
    if err != nil {
        return err
    }

    err = json.Unmarshal(data, v)
    return err
}

func main() {
    err := LoadConfig()
    if err != nil {
        panic(err)
    }
    fmt.Printf("%+v\n", App)
}
Другие вопросы по тегам