Как встроить интерфейс в структуру, чтобы имя интерфейса не стало ключом внутри JSON? - PullRequest
0 голосов
/ 25 февраля 2020

У меня есть интерфейс EventAggregation, который реализован многими различными типами. Мне нужно обогатить все эти типы одними и теми же двумя полями, поэтому я делаю что-то вроде этого:

type messagePayload struct {
    domain.EventAggregation
    SourceSystem     string `json:"sourceSystem"`
    MessageTimestamp int    `json:"messageTimestamp"`
}

Затем я перевожу это в строку с помощью этого метода:

func (payload messagePayload) payloadToString() string {
    jsonForm, _ := json.Marshal(payload)
    return string(jsonForm)
}

Но он создает строку с «EventAggregation» в качестве ключа, и поля внедряются как объект в него, например:

{"EventAggregation":{"startTime":1575941942501,"endTime":1581461995869,"computeTimestamp":1582573485983,"eventType":"foo","count":146692},"sourceSystem":"bar","messageTimestamp":1582573497406}

Как создать строку таким образом, чтобы поля внутри EventAggregation находятся на одном уровне с полями «SourceSystem» и «MessageTimestamp»? Например:

{"startTime":1575941942501,"endTime":1581461995869,"computeTimestamp":1582573485983,"eventType":"foo","count":146692,"sourceSystem":"bar","messageTimestamp":1582573497406}

Тот же код работает, если внедренный объект является структурой, а не интерфейсом, но это не очень практично, учитывая, сколько различных структур реализуют интерфейс "EventAggregation".

Ответы [ 2 ]

1 голос
/ 25 февраля 2020

Если я понимаю ваш вопрос, может быть, это может помочь вам:

type messagePayload struct {
    domain.EventAggregation `json:"-"`
    SourceSystem     string `json:"sourceSystem"`
    MessageTimestamp int    `json:"messageTimestamp"`
}
0 голосов
/ 25 февраля 2020

Все, что вам нужно сделать, это игнорировать этот файл при кодировании json. Попробуйте это:

type messagePayload struct {
    domain.EventAggregation `json:"-"`
    SourceSystem     string `json:"sourceSystem"`
    MessageTimestamp int    `json:"messageTimestamp"`
}

Чтобы проверить больше поддерживаемых тегов, посетите: https://golang.org/pkg/encoding/json/#Marshal

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