php小編魚仔為您介紹JSON數組作為Go結構的使用方法。在Go語言中,JSON數組是一種常見的數據結構,它可以用來表示多個相同類型的數據。通過將JSON數組映射為Go的結構體,我們可以方便地對其進行操作和處理。本文將詳細介紹如何使用Go語言中的JSON包來解析和構建JSON數組,并將其轉換為相應的Go結構體,以實現數據的有效管理和處理。無論您是Go語言初學者還是有一定經驗的開發(fā)者,本文都將為您帶來實用的技巧和方法,幫助您更好地理解和應用JSON數組作為Go結構的相關知識。
問題內容
我試圖從 json 文件調用對象數組,但總是遇到錯誤:“無法將數組解組為 config.appconfig 類型的 go 值”。
如何確保我的 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": "***********"
}
]
登錄后復制
預先感謝您的幫助!
解決方法
您的配置 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)
}
登錄后復制






