use JsonSerializable to convert to json