在 Golang 中创建此 JSON 对象的最佳方法

Tom*_*ely 3 arrays json struct go

我正在尝试找到使用 Go 创建此 JSON 对象的最佳方法:

{
  "Clients" : [
    {
      "Hostname" : "example.com",
      "IP" : "127.0.0.1",
      "MacAddr" : "mactonight"
    },
    {
      "Hostname" : "foo.biz",
      "IP" : "0.0.0.0",
      "MacAddr" : "12:34:56:78"
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

在我现有的代码中,我当前正在切片多个字符串行,然后将每行拆分为 3 个单独的变量(主机、ip、ma​​c)。例如hostname 192.168.1.0 F0:F0:F0:F0:F0连续转换。

这是通过以下代码完成的:

func parselines(line string){
    for _, line := range strings.Split(line, "\n") {
        if line != "" {
            s := strings.Split(line, " ")
            host, ip, mac := s[0], s[1], s[2]
            fmt.Println("Hostname: " + host + " IP: " + ip + " MAC: " + mac)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

因此,在这个 for 循环中,我希望构建上面提到的 JSON 对象。我尝试过使用结构,但我真的很困惑如何使用它们。我已经使用 Ruby 完成了这项工作,只需要几行代码,但 Go 似乎相当具有挑战性(对我来说就是这样!)。在 ruby​​ 中,它是这样完成的:

require 'json'

clients = []

STDIN.each do |line|
  fields = line.split(/\s+/)
  clients << {
    Hostname: fields[0],
    IP: fields[1],
    MacAddr: fields[2]
  }
end

connections = {}
connections[:Clients] = clients
puts connections.to_json
Run Code Online (Sandbox Code Playgroud)

小智 8

声明与 JSON 文档结构匹配的类型。

type client struct {
    Hostname string `json:"Hostname"`
    IP       string `json:"IP"`
    MacAddr  string `json:"MacAddr"`
}

type connection struct {
    Clients []*client `json:"Clients"`
}
Run Code Online (Sandbox Code Playgroud)

使用这些类型初始化值并编码为 JSON。

var clients []*client
for _, line := range strings.Split(line, "\n") {
    if line != "" {
        s := strings.Split(line, " ")
        clients = append(clients, &client{Hostname: s[0], IP: s[1], MacAddr: s[2]})
    }
}

p, _ := json.Marshal(connection{Clients: clients})
fmt.Printf("%s\n", p)
Run Code Online (Sandbox Code Playgroud)

json:"Hostname"本示例中不需要JSON 字段标记 ( ),因为 JSON 对象键是有效的导出标识符。我在此处包含标签是因为经常需要它们。

在 Go Playground 上运行代码