Похоже, что вы, возможно, пытаетесь выполнить пользовательское демаршалирование, используя стандартный демаршалер, а затем пост-обработку данных.Однако, как вы обнаружили, очевидный способ сделать это вызывает бесконечный цикл!
Обычный обходной путь - создать псевдоним вашего типа, использовать 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
}