我正在尝试在Go中解码一些json,但某些字段不会被解码。在此处查看在浏览器中运行的代码:
我究竟做错了什么?
我只需要MX记录,所以没有定义其他字段。据我从godoc了解到,您不需要定义不需要/不需要的字段。
// 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) }
按照有关json.Unmarshal的go documentaiton 所述,您只能对导出的字段进行解码,主要原因是外部软件包(例如encoding/json)无法访问未导出的字段。
encoding/json
如果您的json不遵循名称的go约定,则可以json在字段中使用标记来更改json键和struct字段之间的匹配。
json
范例:
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) }