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、mac)。例如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 对象键是有效的导出标识符。我在此处包含标签是因为经常需要它们。