как построить сложную структуру данных Go - PullRequest
0 голосов
/ 26 октября 2018

У меня есть следующая структура данных для создания и отправки данных в нем.Затем преобразуйте его в json и запишите файл.Мне нужен массив.Его элементом является карта.Значение map["targets"] - это массив, а map["labels"] - другая карта.Как построить сложную структуру данных?

[
  {
    "targets": ["10.11.150.1:7870", "10.11.150.4:7870"],
    "labels": {
      "job": "mysql"
    }
  },
  {
    "targets": ["10.11.122.11:6001", "10.11.122.15:6002"],
    "labels": {
      "job": "postgres"
    }
  }
]

~

Ответы [ 2 ]

0 голосов
/ 26 октября 2018

Итак, ваша структура будет выглядеть следующим образом:

type Obj struct {
    Targets []string `json:"targets"`
    Labels map[string]string `json:"labels"`
}

Заполните его:

obj := []Obj{
    Obj{
        Targets: []string{"10.11.150.1:7870", "10.11.150.4:7870"},
        Labels: map[string]string{
            "job": "mysql",
        },
    },
    Obj{
        Targets: []string{"10.11.122.11:6001", "10.11.122.15:6002"},
        Labels: map[string]string{
            "job": "postgres",
        },
    },
}

Выделите его в строку:

jsonBytes, err := json.Marshal(obj)
if err != nil {
    log.Fatal("error marshaling struct to JSON:", err)
}

Напишите его вфайл:

if err := ioutil.WriteFile("output.json", jsonBytes, 0644); err != nil {
    log.Fatal("error writing file:", err)
}

Здесь все вместе:

package main

import (
    "encoding/json"
    "fmt"
    "io/ioutil"
    "log"
)

type obj struct {
    Targets []string          `json:"targets"`
    Labels  map[string]string `json:"labels"`
}

func main() {

    obj := []obj{
        obj{
            Targets: []string{"10.11.150.1:7870", "10.11.150.4:7870"},
            Labels: map[string]string{
                "job": "mysql",
            },
        },
        obj{
            Targets: []string{"10.11.122.11:6001", "10.11.122.15:6002"},
            Labels: map[string]string{
                "job": "postgres",
            },
        },
    }

    jsonBytes, err := json.Marshal(obj)
    if err != nil {
        log.Fatal("error marshaling struct to JSON:", err)
    }

    if err := ioutil.WriteFile("output.json", jsonBytes, 0644); err != nil {
        log.Fatal("error writing file:", err)
    }

    fmt.Printf("%+v\n", jsonBytes)
}
0 голосов
/ 26 октября 2018

Этот пример может вам помочь:

package main

import (
    "fmt"
    "encoding/json"
    "io/ioutil"
)

type Object struct {
    Targets []string `json:"targets"`
    Labels  Label    `json:"labels"`
}

type Label struct {
    Job string `json:"job"`
}

type Objects []Object

func main() {
    objs := Objects{
      {
        Targets: []string{"10.11.150.1:7870", "10.11.150.4:7870"},
        Labels:  Label{Job: "mysql"},
      },
      {
        Targets: []string{"10.11.122.11:6001", "10.11.122.15:6002"},
        Labels:  Label{Job: "postgres"},
      },
    }

    bytes, err := json.Marshal(objs)
    if err != nil {
        fmt.Println(err)
        return
    }
    fmt.Println(string(bytes))

    // 0644 is the file mode: https://golang.org/pkg/os/#FileMode
    if err := ioutil.WriteFile("objs.json", bytes, 0644); err != nil {
      fmt.Println(err)
    }
}

Дополнительная информация: Преобразование структуры Go в JSON , Пример: запись файлов

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