improved MarshalJson()