Как сделать маршалл структурой со встроенным структурным полем, чтобы она была плоским объектом JSON в Go? - PullRequest
0 голосов
/ 25 сентября 2019
package main

import (
    "encoding/json"
    "fmt"
)

type City struct {
    City string `json:"City"`
    Size int        `json:"Size"`
}

type Location struct {
    City City
    State string `json:"State"`
}

func main() {
    city := City{City: "San Francisco", Size: 8700000}
    loc := Location{}
    loc.State = "California"
    loc.City = city
    js, _ := json.Marshal(loc)
    fmt.Printf("%s", js)
}

Выводит следующее:

{"City":{"City":"San Francisco","Size":8700000},"State":"California"}

Предполагаемый вывод, который мне нужен:

{"City":"San Francisco","Size":8700000,"State":"California"}

Я прочитал сообщение в блоге для пользовательскихJSON Marshalling, но я не могу заставить его работать для структуры с другой встроенной структурой.

Я попытался сгладить структуру, определив пользовательскую функцию MarshalJSON, но все равно получаю тот же вложенный вывод:

func (l *Location) MarshalJSON() ([]byte, error) {
    return json.Marshal(&struct {
            City string `json:"City"`
            Size int    `json:"Size"`
            State string `json:"State"`
    }{
        City: l.City.City,
        Size: l.City.Size,
        State:   l.State,
    })
}

1 Ответ

3 голосов
/ 25 сентября 2019

Используйте анонимное поле для выравнивания вывода JSON:

type City struct {
    City string `json:"City"`
    Size int        `json:"Size"`
}

type Location struct {
    City     // <-- anonymous field has type, but no field name
    State string `json:"State"`
}

Метод MarshalJSON в вопросе игнорируется, поскольку код кодирует значение Location, но метод MarshalJSON объявлен сприемник указателя.Исправить кодировкой *Location.

js, _ := json.Marshal(&loc)  // <-- note &
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...