It looks like you may be trying to do custom unmarshaling by using the default unmarshaler and then post-processing the data. However, as you've discovered, the obvious way of trying this causes an infinite loop!
The usual workaround is to create a new type using your type, use the default unmarshaler on an instance of the new type, post-process the data, and then finally cast to the original type and assign back to the target instance. Note that you'll want to implement UnmarshalJSON on a pointer type.
For example:
func (x *Xapo) UnmarshalJSON(data []byte) error {
// Create a new type from the target type to avoid recursion.
type Xapo2 Xapo
// Unmarshal into an instance of the new type.
var x2 Xapo2
err := json.Unmarshal(data, &x2)
if err != nil {
return err
}
// Perform post-processing here.
// TODO
// Cast the new type instance to the original type and assign.
*x = Xapo(x2)
return nil
}