JSON Применить сопоставление карты для объекта - PullRequest
0 голосов
/ 31 декабря 2018

Я пишу конечную точку REST для операции обновления модели.Отображение - это просто пересылка тела запроса с []byte на json.Unmarshal.Однако сейчас я пытаюсь отфильтровать свойство uuid от изменения в указанной модели.Поэтому вместо демаршалинга модели я сейчас делаю это для map[string]interface{}, а затем запускаю delete(m, "uuid").

. На данный момент у меня есть карта данных, но как я могу передать ее в json отобразить это, как обычно, при вызове Unmarshal или Decode?Есть ли лучший вариант, чем маршалинг для результата []byte и затем демаршалирование на модель?

1 Ответ

0 голосов
/ 31 декабря 2018

Вы можете пометить поле UUID вашего объекта (структуры) с помощью json:"-", чтобы оно было исключено из процесса маршалинга / демаршалинга, например:

type User struct {
    Name string `json:"name"`
    UUID string `json:"-"`
}

Если вам нужно маршалировать / анмаршалироватьполе UUID тоже в других местах вашего приложения, тогда самым простым решением было бы сохранить поле UUID перед демаршалингом, а затем восстановить его после маршалинга, например:

u := getUser() // acquire your object

uuid := u.UUID // save field

err := json.Unmarshal(data, &u)
// handle error

u.UUID = uuid // restore field

Обернуть его в служебную функцию,так что вы можете использовать его повторно:

func decodeUser(u *User, data []byte) error {
    uuid := u.UUID // save field
    if err := json.Unmarshal(data, &u); err != nil {
        return err
    }
    u.UUID = uuid // restore field
    return nil
}

Обратите внимание, что существуют сторонние библиотеки для отображения карт в значениях стояков (например, github.com/mitchellh/mapstructure), но сначала демонтирование в карту, а затем отображениеэто в структуру значительно медленнее, чем демаршалирование в значение структуры и сохранение / восстановление одного поля.

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