Для кодирования структуры в строку JSON стандартная библиотека предоставляет три способа:
- Использование
Encoder
, которые преобразуют структуру в строку JSON, а затем записывают еедо io.Writer
.Этот обычно используется, если вы хотите отправить данные JSON в виде HTTP-запроса или сохранить строку JSON в файл. - Используя
Marshal
, которые просто преобразуют структуру в байты, что может бытьлегко конвертируется в строку. - Использование
MarshalIndent
, которое работает как Marshal
, за исключением того, что оно также преобразует вывод.Это то, что вы хотите для вашей проблемы прямо сейчас.
Чтобы сравнить эти три метода, вы можете использовать этот код ( Go Playground ):
package main
import (
"bytes"
"encoding/json"
"fmt"
)
type MainStructure struct {
Text string `json:"text,omitempty"`
Array []TestArray `json:"test_array,omitempty"`
}
type TestArray struct {
ArrayText string `json:"array_text,omitempty"`
}
func main() {
Test := MainStructure{
Text: "test",
Array: []TestArray{
{ArrayText: "test1"},
{ArrayText: "test2"},
},
}
// Using marshal indent
btResult, _ := json.MarshalIndent(&Test, "", " ")
fmt.Println("Using Marshal Indent:\n" + string(btResult))
// Using marshal
btResult, _ = json.Marshal(&Test)
fmt.Println("\nUsing Marshal:\n" + string(btResult))
// Using encoder
var buffer bytes.Buffer
json.NewEncoder(&buffer).Encode(&Test)
fmt.Println("\nUsing Encoder:\n" + buffer.String())
}
Вывод будет выглядеть так:
Using Marshal Indent:
{
"text": "test",
"test_array": [
{
"array_text": "test1"
},
{
"array_text": "test2"
}
]
}
Using Marshal:
{"text":"test","test_array":[{"array_text":"test1"},{"array_text":"test2"}]}
Using Encoder:
{"text":"test","test_array":[{"array_text":"test1"},{"array_text":"test2"}]}