implement json.Marshaler and json.Unmarshaler interfaces