Мы получаем некоторый JSON-ввод, демаршируем, выполняем некоторую работу, затем маршалируем и отправляем куда-то еще.JSON, который мы получаем, может иметь поле с именем «user».Когда мы возвращаемся в JSON, нам нужно изменить это поле «user» на «username».Мы можем сделать это, создав новую структуру со всеми одинаковыми полями, но с разными тегами JSON, но это кажется немного громоздким.Я думал, что здесь будет работать собственный маршаллер, но я немного застрял.Рассмотрим следующий код.
package main
import (
"encoding/json"
"fmt"
)
type StructA struct {
Username string `json:"user"`
Process string `json:"process"`
}
func main() {
var test1 StructA
err := json.Unmarshal([]byte(`{"user": "user123", "process": "something"}`), &test1)
if err != nil {
fmt.Println(err)
}
// do some work with test1
jsonByte, err := json.Marshal(&test1)
if err != nil {
fmt.Println(err)
}
fmt.Println(string(jsonByte))
}
func (u *StructA) MarshalJSON() ([]byte, error) {
type Alias StructA
return json.Marshal(&struct {
Username string `json:"username"`
*Alias
}{
Username: u.Username,
Alias: (*Alias)(u),
})
}
https://play.golang.org/p/_w0rlQrcgrW
В идеале это позволило бы мне изменить тег JSON в этом поле с «user» на «username».Тем не менее, я получаю «username» и «user».
{"username":"user123","user":"user123","process":"something"}
Я, конечно, мог бы создать совершенно новую структуру, которая отражает StructA с нужными мне тегами, но мне не нужно копировать каждыйединое поле и беспокоиться о синхронизации этих двух структур.Это не конец света, но это не кажется хорошим подходом.
Для ясности, конечный результат, который я ищу, следующий:
{"username":"user123","process":"something"}
Я уверен, что упускаю что-то тривиальное здесь, но это была длинная неделя, и любая помощь будет оценена.Спасибо!