Как вызвать json.Unmarshal внутри UnmarshalJSON, не вызывая переполнение стека? - PullRequest
0 голосов
/ 21 сентября 2018

Как я могу создать метод UnmarshalJSON внутри структуры, использовать json.Unmarshal внутри, не вызывая переполнение стека?

package xapo

type Xapo struct {}

func (x Xapo) UnmarshalJSON(data []byte) error {
    err := json.Unmarshal(data, &x)
    if err != nil {
        return err
    }
    fmt.Println("done!")
    return nil
}

Может кто-нибудь объяснить мне, почему происходит переполнение стека?Можно ли это исправить?

Заранее спасибо.

1 Ответ

0 голосов
/ 21 сентября 2018

Похоже, что вы, возможно, пытаетесь выполнить пользовательское демаршалирование, используя стандартный демаршалер, а затем пост-обработку данных.Однако, как вы обнаружили, очевидный способ сделать это вызывает бесконечный цикл!

Обычный обходной путь - создать псевдоним вашего типа, использовать unmarshaler по умолчанию для экземпляра этого псевдонима, post-обработать данные, а затем, наконец, привести к исходному типу и присвоить обратно целевому экземпляру.Обратите внимание, что вы захотите реализовать UnmarshalJSON для типа указателя.

Например:

func (x *Xapo) UnmarshalJSON(data []byte) error {
  // Create an alias of the target type to avoid recursion.
  type Xapo2 Xapo

  // Unmarshal into an instance of the aliased type.
  var x2 Xapo2
  err := json.Unmarshal(data, &x2)
  if err != nil {
    return err
  }

  // Perform post-processing here.
  // TODO

  // Cast the aliased instance type into the original type and assign.
  *x = Xapo(x2)
  return nil
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...