json - 如何将json解码为结构

标签 json go

我正在尝试在 Go 中解码一些 json,但有些字段没有被解码。 查看浏览器中运行的代码here :

我做错了什么?

我只需要 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 文档,只能对exported fields解码,主要原因是外部包(如encoding/json)无法访问未导出的字段。

如果您的 json 名称不遵循 go 约定,您可以在字段中使用 json 标记来更改 json 键和结构字段之间的匹配。

例子:

package main

import (
    "fmt"
    "encoding/json"
)

type T struct {
    Foo  string `json:"foo"`
    priv string `json:"priv"`
}

func main() {
    text := []byte(`{"foo":"bar", "priv":"nothing"}`)
    var t T
    err := json.Unmarshal(text, &t)
    if err != nil {
        panic(err)
    }
    fmt.Println(t.Foo) // prints "bar"
    fmt.Println(t.priv) // prints "", priv is not exported
}

关于json - 如何将json解码为结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24299818/

相关文章:

json - Elasticsearch-使用jq导出到CSV

java - 在循环内创建对象好吗?

json - 解析[对象对象] Angular 6

go - 从LOOP中存储值(value)

javascript - 如何在javascript中使用动态golang html模板id?

unicode - 如何在 Go 中从编码转换为 UTF-8?

c# - 在 C# 中使用 Json.net 格式化 Json

javascript - 管理复杂的 json 响应

multithreading - golang可以启动多线程来处理网络IO吗

Golang bolt 获取值