我正在尝试解码golang中的一些json,但有些字段无法解码。 查看在浏览器here中运行的代码:
我做错了什么? 我只需要MX记录,所以我没有定义其他字段。据我所知,你不需要定义你不使用/不需要的字段。
// You can edit this code!
// Click here and start typing.
package main
import "fmt"
import "encoding/json"
func main() {
body := `
{"response": {
"status": "SUCCESS",
"data": {
"mxRecords": [
{
"value": "us2.mx3.mailhostbox.com.",
"ttl": 1,
"priority": 100,
"hostName": "@"
},
{
"value": "us2.mx1.mailhostbox.com.",
"ttl": 1,
"priority": 100,
"hostName": "@"
},
{
"value": "us2.mx2.mailhostbox.com.",
"ttl": 1,
"priority": 100,
"hostName": "@"
}
],
"cnameRecords": [
{
"aliasHost": "pop.a.co.uk.",
"canonicalHost": "us2.pop.mailhostbox.com."
},
{
"aliasHost": "webmail.a.co.uk.",
"canonicalHost": "us2.webmail.mailhostbox.com."
},
{
"aliasHost": "smtp.a.co.uk.",
"canonicalHost": "us2.smtp.mailhostbox.com."
},
{
"aliasHost": "imap.a.co.uk.",
"canonicalHost": "us2.imap.mailhostbox.com."
}
],
"dkimTxtRecord": {
"domainname": "20a19._domainkey.a.co.uk",
"value": "\"v=DKIM1; g=*; k=rsa; p=DkfbhO8Oyy0E1WyUWwIDAQAB\"",
"ttl": 1
},
"spfTxtRecord": {
"domainname": "a.co.uk",
"value": "\"v=spf1 redirect=_spf.mailhostbox.com\"",
"ttl": 1
},
"loginUrl": "us2.cp.mailhostbox.com"
}
}}`
type MxRecords struct {
value string
ttl int
priority int
hostName string
}
type Data struct {
mxRecords []MxRecords
}
type Response struct {
Status string `json:"status"`
Data Data `json:"data"`
}
type apiR struct {
Response Response
}
var r apiR
err := json.Unmarshal([]byte(body), &r)
if err != nil {
fmt.Printf("err was %v", err)
}
fmt.Printf("decoded is %v", r)
}
答案 0 :(得分:18)
根据关于json.Unmarshal的go文档,您只能解码导出的字段,主要原因是外部包(例如encoding/json
)无法访问未导出的字段。
如果您的json没有遵循名称的go约定,您可以使用字段中的json
标记来更改json键和struct字段之间的匹配。
例:
package main
import (
"fmt"
"encoding/json"
)
type T struct {
Foo string `json:"foo"`
}
func main() {
text := []byte(`{"foo":"bar"}`)
var t T
err := json.Unmarshal(text, &t)
if err != nil {
panic(err)
}
fmt.Println(t)
}
答案 1 :(得分:7)
您必须使用大写结构字段:
type MxRecords struct {
Value string `json:"value"`
Ttl int `json:"ttl"`
Priority int `json:"priority"`
HostName string `json:"hostName"`
}
type Data struct {
MxRecords []MxRecords `json:"mxRecords"`
}
答案 2 :(得分:1)
encoding/json
包只能解码为导出的struct字段。您的Data.mxRecords
成员未导出,因此在解码时会被忽略。如果您将其重命名为使用大写字母,JSON包将注意到它。
您需要为MxRecords
类型的所有成员执行相同的操作。