Как разрешить ссылки в Unmarshaled struct - PullRequest
0 голосов
/ 13 ноября 2018

У меня есть два json-файла, которые я распаковываю в Go.

Первый включает определенный тип объекта, на который ссылается ID во втором наборе.

// Foo
{
  "id": 5,
  "key": "value"
}

и

// Bar
{
  "name": "bar",
  "fooReferenceId": 5
}

Я хочу закончить с struct как

type Bar struct {
  Name string
  Foo *Foo
}

Есть ли способ достичь этого прямо так же, как мы предоставляем json:"..." средство распознавания ключа?

Что-то вроде

type Bar struct {
  Name string `json:"name"`
  Foo  *Foo   resolveFooById(`json:"fooReferenceId"`)
}

1 Ответ

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

Вам нужно использовать пользовательский демаршалер, как в примере внизу этого поста:

http://choly.ca/post/go-json-marshalling/

Для вашего примера это будет выглядеть так:

func (b *Bar) UnmarshalJSON(input []byte) error {
    type Alias Bar
    aux := &struct {
        FooReferenceID int `json:"fooReferenceId"`
        *Alias
    }{
        Alias: (*Alias)(b),
    }
    if err := json.Unmarshal(input, &aux); err != nil {
        return err
    }
    for index, foo := range foos {
        if foo.ID == aux.FooReferenceID {
            b.Foo = &foos[index]
            break
        }
    }
    return nil
}

Полный исполняемый пример здесь:

https://play.golang.org/p/SCpsVCgnSSK

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