Кодирование структуры в json Go - PullRequest
0 голосов
/ 23 февраля 2019

У меня есть проблема со структурой кодирования для json, мой код

type MainStructure struct {
    Text  string      <code>json:"text,omitempty"</code>
    Array []TestArray <code>json:"test_array,omitmepty"</code>
}</p>

<p>type TestArray struct {
    ArrayText string <code>json:"array_text,omitempty"</code>
}</p>

<p>func main() {
    Test := MainStructure{
        Text: "test",
        Array: [
            {
                ArrayText: "test1"
            },
            {
                ArrayText: "test2"
            }
        ]
    }
    body := new(bytes.Buffer)
    json.NewEncoder(body).Encode(&Test)
    fmt.Println(string([]byte(body)))
}

, требуемый результат должен быть

{
    "text": "test",
    "test_array": [
        {
            "array_text": "test1"
        },
        {
            "array_text": "test2"
        }
    ]
}

Я не против, если это "Marshal" или "encoding /"JSON "

Ответы [ 3 ]

0 голосов
/ 23 февраля 2019

Я не смог получить точку, которую вы хотели использовать bytes.Buffer, если ваша цель - просто поместить результат в консоль.Предполагая, что точка:

  1. Создайте экземпляр структуры (соответствующий объекту JSON)
  2. Создайте его на экране

Следующий код может помочьВы:

package main

import "encoding/json"
import "fmt"

type MainStructure struct {
    Text  string      `json:"text,omitempty"`
    Array []TestArray `json:"test_array,omitmepty"`
}

type TestArray struct {
    ArrayText string `json:"array_text,omitempty"`
}

func main() {
    Test := MainStructure{
        Text: "test",
        Array: []TestArray{
            TestArray{"test1"},
            TestArray{"test2"},
        },
    }

    res, _ := json.MarshalIndent(Test, "", "\t")
    fmt.Println(string(res))
}

json.MarshalIndent используется, чтобы сделать результат довольно отформатированным, если вам это надо.

0 голосов
/ 23 февраля 2019

Для кодирования структуры в строку 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"}]}

0 голосов
/ 23 февраля 2019

Прежде всего я думаю, что вы ошибаетесь в том, как создать struct in go, так как вы можете легко конвертировать их в json.

Сначала вы должны создать правильную структуру, а затем выполнить json.marshal(Test), чтобыпреобразовать его в правильный json, например:

package main

import (
    "encoding/json"
    "fmt"
)

func main() {

    type TestArray struct {
        ArrayText string `json:"array_text,omitempty"`
    }
    type MainStructure struct {
        Text  string      `json:"text,omitempty"`
        Array []TestArray `json:"test_array,omitmepty"`
    }

    Test := MainStructure{
        Text: "test",
        Array: []TestArray{
            TestArray{ArrayText: "test1"},
            TestArray{ArrayText: "test2"},
        }}
    bytes, err := json.Marshal(Test)
    if err != nil {
        fmt.Println("eror marshalling")
    } else {
        fmt.Println(string(bytes))
    }
}

Проверьте это на play.golang.org

...