public void Serialize(JsonWriter writer, object obj, JsonSerializer serializer) { if (obj == null) return; var issue = (Issue) obj; writer.WriteStartObject(); writer.WriteValue(RedmineKeys.ISSUE); writer.WriteProperty(RedmineKeys.SUBJECT, issue.Subject); writer.WriteProperty(RedmineKeys.DESCRIPTION, issue.Description); writer.WriteProperty(RedmineKeys.NOTES, issue.Notes); if (issue.Id != 0) { writer.WriteProperty(RedmineKeys.PRIVATE_NOTES, issue.PrivateNotes); } writer.WriteProperty(RedmineKeys.IS_PRIVATE, issue.IsPrivate); writer.WriteIdIfNotNull(RedmineKeys.PROJECT_ID, issue.Project); writer.WriteIdIfNotNull(RedmineKeys.PRIORITY_ID, issue.Priority); writer.WriteIdIfNotNull(RedmineKeys.STATUS_ID, issue.Status); writer.WriteIdIfNotNull(RedmineKeys.CATEGORY_ID, issue.Category); writer.WriteIdIfNotNull(RedmineKeys.TRACKER_ID, issue.Tracker); writer.WriteIdIfNotNull(RedmineKeys.ASSIGNED_TO_ID, issue.AssignedTo); writer.WriteIdIfNotNull(RedmineKeys.FIXED_VERSION_ID, issue.FixedVersion); writer.WriteValueOrEmpty(RedmineKeys.ESTIMATED_HOURS, issue.EstimatedHours); writer.WriteIdOrEmpty(RedmineKeys.PARENT_ISSUE_ID, issue.ParentIssue); writer.WriteDateOrEmpty(RedmineKeys.START_DATE, issue.StartDate); writer.WriteDateOrEmpty(RedmineKeys.DUE_DATE, issue.DueDate); writer.WriteDateOrEmpty(RedmineKeys.UPDATED_ON, issue.DueDate); if (issue.DoneRatio != null) writer.WriteProperty(RedmineKeys.DONE_RATIO, issue.DoneRatio.Value.ToString(CultureInfo.InvariantCulture)); if (issue.SpentHours != null) writer.WriteProperty(RedmineKeys.SPENT_HOURS, issue.SpentHours.Value.ToString(CultureInfo.InvariantCulture)); writer.WriteArray(RedmineKeys.UPLOADS, issue.Uploads, new UploadConverter(), serializer); writer.WriteArray(RedmineKeys.CUSTOM_FIELDS, issue.CustomFields, new IssueCustomFieldConverter(), serializer); writer.WriteIdsArray(RedmineKeys.WATCHER_USER_IDS, issue.Watchers); writer.WriteEndObject(); }