Лучший способ создать этот JSON объект в Golang - PullRequest
0 голосов
/ 20 июня 2020

Я пытаюсь найти лучший способ создать этот JSON объект, используя Go:

{
  "Clients" : [
    {
      "Hostname" : "example.com",
      "IP" : "127.0.0.1",
      "MacAddr" : "mactonight"
    },
    {
      "Hostname" : "foo.biz",
      "IP" : "0.0.0.0",
      "MacAddr" : "12:34:56:78"
    }
  ]
}

В моем существующем коде я сейчас нарезаю несколько строковых строк, а затем разделяю каждую строку на 3 отдельные переменные (host, 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)
        }
    }
}

Итак, в рамках этого для l oop я бы хотел построить 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

Ответы [ 3 ]

3 голосов
/ 20 июня 2020

Объявите типы, которые соответствуют структуре документа JSON.

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

type connection struct {
    Clients []*client `json:"Clients"`
}

Инициализируйте значения с использованием этих типов и закодируйте их в 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)

JSON Теги полей (json:"Hostname") не нужны в этом примере, потому что ключи объекта JSON являются действительными экспортируемыми идентификаторами . Я включил теги сюда, потому что они часто нужны.

Запустите код на Go Playground .

2 голосов
/ 20 июня 2020

Создавайте срезы и карты в соответствии со структурой нужных данных.

var clients []interface{}
for _, line := range strings.Split(line, "\n") {
    if line != "" {
        s := strings.Split(line, " ")
        clients = append(clients, map[string]string{"Hostname": s[0], "IP": s[1], "MAC": s[2]})
    }
}
connections := map[string]interface{}{"Clients": clients}
p, _ := json.Marshal(connections)
fmt.Printf("%s\n", p)
1 голос
/ 20 июня 2020

Вам нужно инициализировать 2 структуры

type Client struct {
    Hostname string
    IP string
    MacAddr string
}

type Connection struct {
    Clients []Client
}

И использовать Marshal для преобразования структуры в Json

var clients []Client
clients = append(clients, Client{
    Hostname: "localhost",
    IP: "127.0.0.1",
    MacAddr: "1123:22512:25632",
})

// add more if you want ...

myJson, _ := json.Marshal(Connection{Clients:clients})
fmt.Println(string(myJson))

Не забудьте импортировать это

import "encoding/json"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...