Значение объекта для JSON в го - PullRequest
0 голосов
/ 14 ноября 2018

У меня есть структура, которая содержит другую структуру в качестве объекта значения.

type User struct {
    Name  string            `json:"name"``
    Email valueobject.Email `json:"email"`
}

valueobject.Email выглядит так:

type Email struct {
    value string
}
func (e *Email) Value() string {
    return e.Value
}

Я хочу, чтобы объект значения был неизменным, для этой задачи также не нужен метод фабрики.

Теперь я хочу вернуть структуру User как json, и поэтому я использую

response := map[string]interface{}{"user": User}
json.NewEncoder(w).Encode(response)

Результат:

{
    "user": {
        "name": "John Doe",
        "email": {
            "Email: "johndoe@example.com"
        }
    }
}

Но я хочу кое-что связать это:

{
    "user": {
        "name": "John Doe",
        "email": "johndoe@example.com"
    }
}

Ответы [ 2 ]

0 голосов
/ 14 ноября 2018

Чтобы ваш тип электронной почты маршалировал так, как вам хотелось бы, вам нужно, чтобы он реализовал интерфейс json.marshaler . GopherAcademy использует следующий пример:

func (d Dog) MarshalJSON() ([]byte, error) {
return json.Marshal(NewJSONDog(d)) }
0 голосов
/ 14 ноября 2018

Похоже, вам нужно valueobject.Email для реализации интерфейса json.Marshaler:

func (e *Email) MarshalJSON() ([]byte, error) {
  return json.Marshal(e.Value())
}

Это самый необходимый минимум для реализации того, что вы просите.Реализуя интерфейс json.Marshaler, он позволяет вам настроить способ визуализации json.Marshal вашего значения.

Другой вариант - упростить Email до просто оболочки для string вместо struct:

type Email string

func (e Email) Value() string {
  return e
}

Поскольку строки уже обработаны json.Marshal, он должен просто работать.

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