diff --git a/src/redmine-net-api/Serialization/IJsonSerializable.cs b/src/redmine-net-api/Serialization/IJsonSerializable.cs
index c325545f..183315c7 100644
--- a/src/redmine-net-api/Serialization/IJsonSerializable.cs
+++ b/src/redmine-net-api/Serialization/IJsonSerializable.cs
@@ -27,7 +27,8 @@ public interface IJsonSerializable
///
///
///
- void WriteJson(JsonWriter writer);
+ ///
+ void WriteJson(JsonWriter writer, bool full = false);
///
///
///
diff --git a/src/redmine-net-api/Types/Attachment.cs b/src/redmine-net-api/Types/Attachment.cs
index b6e188a6..2c5f3606 100644
--- a/src/redmine-net-api/Types/Attachment.cs
+++ b/src/redmine-net-api/Types/Attachment.cs
@@ -166,8 +166,8 @@ public override void ReadJson(JsonReader reader)
///
///
///
-
- public override void WriteJson(JsonWriter writer)
+ ///
+ public override void WriteJson(JsonWriter writer, bool full = false)
{
using (new JsonObject(writer, RedmineKeys.ATTACHMENT))
{
diff --git a/src/redmine-net-api/Types/Attachments.cs b/src/redmine-net-api/Types/Attachments.cs
index 7797e7e7..0e70e25b 100644
--- a/src/redmine-net-api/Types/Attachments.cs
+++ b/src/redmine-net-api/Types/Attachments.cs
@@ -36,7 +36,8 @@ public void ReadJson(JsonReader reader) { }
///
///
///
- public void WriteJson(JsonWriter writer)
+ ///
+ public void WriteJson(JsonWriter writer, bool full = false)
{
using (new JsonObject(writer, RedmineKeys.ATTACHMENTS))
{
diff --git a/src/redmine-net-api/Types/ChangeSet.cs b/src/redmine-net-api/Types/ChangeSet.cs
index 5a362d68..07a7b036 100644
--- a/src/redmine-net-api/Types/ChangeSet.cs
+++ b/src/redmine-net-api/Types/ChangeSet.cs
@@ -138,7 +138,8 @@ public void ReadJson(JsonReader reader)
///
///
///
- public void WriteJson(JsonWriter writer) { }
+ ///
+ public void WriteJson(JsonWriter writer, bool full = false) { }
#endregion
#region Implementation of IEquatable
diff --git a/src/redmine-net-api/Types/CustomFieldPossibleValue.cs b/src/redmine-net-api/Types/CustomFieldPossibleValue.cs
index 0934e711..b28959e5 100644
--- a/src/redmine-net-api/Types/CustomFieldPossibleValue.cs
+++ b/src/redmine-net-api/Types/CustomFieldPossibleValue.cs
@@ -127,7 +127,8 @@ public void ReadJson(JsonReader reader)
///
///
///
- public void WriteJson(JsonWriter writer) { }
+ ///
+ public void WriteJson(JsonWriter writer, bool full = false) { }
#endregion
#region Implementation of IEquatable
diff --git a/src/redmine-net-api/Types/CustomFieldValue.cs b/src/redmine-net-api/Types/CustomFieldValue.cs
index 0a0f1033..7588b583 100644
--- a/src/redmine-net-api/Types/CustomFieldValue.cs
+++ b/src/redmine-net-api/Types/CustomFieldValue.cs
@@ -128,7 +128,8 @@ public void ReadJson(JsonReader reader)
///
///
///
- public void WriteJson(JsonWriter writer)
+ ///
+ public void WriteJson(JsonWriter writer, bool full = false)
{
}
diff --git a/src/redmine-net-api/Types/Detail.cs b/src/redmine-net-api/Types/Detail.cs
index 298e93b7..9b2e6d43 100644
--- a/src/redmine-net-api/Types/Detail.cs
+++ b/src/redmine-net-api/Types/Detail.cs
@@ -124,11 +124,13 @@ public void WriteXml(XmlWriter writer) { }
#endregion
#region Implementation of IJsonSerialization
+
///
///
///
///
- public void WriteJson(JsonWriter writer) { }
+ ///
+ public void WriteJson(JsonWriter writer, bool full = false) { }
///
///
diff --git a/src/redmine-net-api/Types/Error.cs b/src/redmine-net-api/Types/Error.cs
index ef6b7b7e..2ce3e3c0 100644
--- a/src/redmine-net-api/Types/Error.cs
+++ b/src/redmine-net-api/Types/Error.cs
@@ -105,7 +105,8 @@ public void ReadJson(JsonReader reader)
///
///
///
- public void WriteJson(JsonWriter writer) { }
+ ///
+ public void WriteJson(JsonWriter writer, bool full = false) { }
#endregion
#region Implementation of IEquatable
diff --git a/src/redmine-net-api/Types/File.cs b/src/redmine-net-api/Types/File.cs
index 2afc20e1..9dfeaf38 100644
--- a/src/redmine-net-api/Types/File.cs
+++ b/src/redmine-net-api/Types/File.cs
@@ -185,7 +185,8 @@ public override void ReadJson(JsonReader reader)
///
///
///
- public override void WriteJson(JsonWriter writer)
+ ///
+ public override void WriteJson(JsonWriter writer, bool full = false)
{
using (new JsonObject(writer, RedmineKeys.FILE))
{
diff --git a/src/redmine-net-api/Types/Group.cs b/src/redmine-net-api/Types/Group.cs
index 9db8382a..2646d0a2 100644
--- a/src/redmine-net-api/Types/Group.cs
+++ b/src/redmine-net-api/Types/Group.cs
@@ -142,7 +142,8 @@ public override void ReadJson(JsonReader reader)
///
///
///
- public override void WriteJson(JsonWriter writer)
+ ///
+ public override void WriteJson(JsonWriter writer, bool full = false)
{
using (new JsonObject(writer, RedmineKeys.GROUP))
{
diff --git a/src/redmine-net-api/Types/Identifiable.cs b/src/redmine-net-api/Types/Identifiable.cs
index 799355b8..99cce122 100644
--- a/src/redmine-net-api/Types/Identifiable.cs
+++ b/src/redmine-net-api/Types/Identifiable.cs
@@ -72,7 +72,8 @@ public virtual void ReadJson(JsonReader reader) { }
///
///
///
- public virtual void WriteJson(JsonWriter writer) { }
+ ///
+ public virtual void WriteJson(JsonWriter writer, bool full = false) { }
#endregion
#region Implementation of IEquatable>
diff --git a/src/redmine-net-api/Types/IdentifiableName.cs b/src/redmine-net-api/Types/IdentifiableName.cs
index 277e6929..80db0841 100644
--- a/src/redmine-net-api/Types/IdentifiableName.cs
+++ b/src/redmine-net-api/Types/IdentifiableName.cs
@@ -147,7 +147,8 @@ public override void ReadJson(JsonReader reader)
///
///
///
- public override void WriteJson(JsonWriter writer)
+ ///
+ public override void WriteJson(JsonWriter writer, bool full = false)
{
writer.WriteIdIfNotNull(RedmineKeys.ID, this);
if (!Name.IsNullOrWhiteSpace())
diff --git a/src/redmine-net-api/Types/Issue.cs b/src/redmine-net-api/Types/Issue.cs
index 7864a2c5..090859f7 100644
--- a/src/redmine-net-api/Types/Issue.cs
+++ b/src/redmine-net-api/Types/Issue.cs
@@ -420,7 +420,8 @@ public override void ReadJson(JsonReader reader)
///
///
///
- public override void WriteJson(JsonWriter writer)
+ ///
+ public override void WriteJson(JsonWriter writer, bool full = false)
{
using (new JsonObject(writer, RedmineKeys.ISSUE))
{
@@ -434,16 +435,52 @@ public override void WriteJson(JsonWriter writer)
}
writer.WriteBoolean(RedmineKeys.IS_PRIVATE, IsPrivate);
- writer.WriteIdIfNotNull(RedmineKeys.PROJECT_ID, Project);
- writer.WriteIdIfNotNull(RedmineKeys.PRIORITY_ID, Priority);
- writer.WriteIdIfNotNull(RedmineKeys.STATUS_ID, Status);
- writer.WriteIdIfNotNull(RedmineKeys.CATEGORY_ID, Category);
- writer.WriteIdIfNotNull(RedmineKeys.TRACKER_ID, Tracker);
- writer.WriteIdIfNotNull(RedmineKeys.ASSIGNED_TO_ID, AssignedTo);
- writer.WriteIdIfNotNull(RedmineKeys.FIXED_VERSION_ID, FixedVersion);
+ if (full)
+ {
+ if (Project != null)
+ using (new JsonObject(writer, RedmineKeys.PROJECT))
+ Project.WriteJson(writer);
+
+ if (Tracker != null)
+ using (new JsonObject(writer, RedmineKeys.TRACKER))
+ Tracker.WriteJson(writer);
+ if(Status != null)
+ using (new JsonObject(writer, RedmineKeys.STATUS))
+ Status.WriteJson(writer);
+ if (Priority != null)
+ using (new JsonObject(writer, RedmineKeys.PRIORITY))
+ Priority.WriteJson(writer);
+ if (Author != null)
+ using (new JsonObject(writer, RedmineKeys.AUTHOR))
+ Author.WriteJson(writer);
+ if (Category != null)
+ using (new JsonObject(writer, RedmineKeys.CATEGORY))
+ Category.WriteJson(writer);
+ if (AssignedTo != null)
+ using (new JsonObject(writer, RedmineKeys.ASSIGNED_TO))
+ AssignedTo.WriteJson(writer);
+ if (ParentIssue != null)
+ using (new JsonObject(writer, RedmineKeys.PARENT))
+ ParentIssue.WriteJson(writer);
+ if (FixedVersion != null)
+ using (new JsonObject(writer, RedmineKeys.FIXED_VERSION))
+ FixedVersion.WriteJson(writer);
+
+ }
+ else
+ {
+ writer.WriteIdIfNotNull(RedmineKeys.PROJECT_ID, Project);
+ writer.WriteIdIfNotNull(RedmineKeys.PRIORITY_ID, Priority);
+ writer.WriteIdIfNotNull(RedmineKeys.STATUS_ID, Status);
+ writer.WriteIdIfNotNull(RedmineKeys.CATEGORY_ID, Category);
+ writer.WriteIdIfNotNull(RedmineKeys.TRACKER_ID, Tracker);
+ writer.WriteIdIfNotNull(RedmineKeys.ASSIGNED_TO_ID, AssignedTo);
+ writer.WriteIdIfNotNull(RedmineKeys.FIXED_VERSION_ID, FixedVersion);
+ writer.WriteIdOrEmpty(RedmineKeys.PARENT_ISSUE_ID, ParentIssue);
+ }
+
writer.WriteValueOrEmpty(RedmineKeys.ESTIMATED_HOURS, EstimatedHours);
- writer.WriteIdOrEmpty(RedmineKeys.PARENT_ISSUE_ID, ParentIssue);
writer.WriteDateOrEmpty(RedmineKeys.START_DATE, StartDate);
writer.WriteDateOrEmpty(RedmineKeys.DUE_DATE, DueDate);
writer.WriteDateOrEmpty(RedmineKeys.UPDATED_ON, UpdatedOn);
diff --git a/src/redmine-net-api/Types/IssueCategory.cs b/src/redmine-net-api/Types/IssueCategory.cs
index c7fb203e..b703f3f4 100644
--- a/src/redmine-net-api/Types/IssueCategory.cs
+++ b/src/redmine-net-api/Types/IssueCategory.cs
@@ -130,7 +130,8 @@ public override void ReadJson(JsonReader reader)
///
///
///
- public override void WriteJson(JsonWriter writer)
+ ///
+ public override void WriteJson(JsonWriter writer, bool full = false)
{
using (new JsonObject(writer, RedmineKeys.ISSUE_CATEGORY))
{
diff --git a/src/redmine-net-api/Types/IssueCustomField.cs b/src/redmine-net-api/Types/IssueCustomField.cs
index d278d5fc..67b576aa 100644
--- a/src/redmine-net-api/Types/IssueCustomField.cs
+++ b/src/redmine-net-api/Types/IssueCustomField.cs
@@ -124,11 +124,13 @@ public override void WriteXml(XmlWriter writer)
#endregion
#region Implementation of IJsonSerialization
+
///
///
///
///
- public override void WriteJson(JsonWriter writer)
+ ///
+ public override void WriteJson(JsonWriter writer, bool full = false)
{
if (Values == null)
{
diff --git a/src/redmine-net-api/Types/IssueRelation.cs b/src/redmine-net-api/Types/IssueRelation.cs
index 7f7e8381..c8874c8b 100644
--- a/src/redmine-net-api/Types/IssueRelation.cs
+++ b/src/redmine-net-api/Types/IssueRelation.cs
@@ -124,11 +124,13 @@ public override void WriteXml(XmlWriter writer)
#endregion
#region Implementation of IJsonSerialization
+
///
///
///
///
- public override void WriteJson(JsonWriter writer)
+ ///
+ public override void WriteJson(JsonWriter writer, bool full = false)
{
AssertValidIssueRelationType();
diff --git a/src/redmine-net-api/Types/Journal.cs b/src/redmine-net-api/Types/Journal.cs
index 9558fa8a..2f7a7c54 100644
--- a/src/redmine-net-api/Types/Journal.cs
+++ b/src/redmine-net-api/Types/Journal.cs
@@ -147,7 +147,7 @@ public override void ReadJson(JsonReader reader)
}
///
- public override void WriteJson(JsonWriter writer)
+ public override void WriteJson(JsonWriter writer, bool full = false)
{
writer.WriteProperty(RedmineKeys.NOTES, Notes);
}
diff --git a/src/redmine-net-api/Types/MembershipRole.cs b/src/redmine-net-api/Types/MembershipRole.cs
index 25af2590..84cd3cf1 100644
--- a/src/redmine-net-api/Types/MembershipRole.cs
+++ b/src/redmine-net-api/Types/MembershipRole.cs
@@ -98,7 +98,8 @@ public override void ReadJson(JsonReader reader)
///
///
///
- public override void WriteJson(JsonWriter writer)
+ ///
+ public override void WriteJson(JsonWriter writer, bool full = false)
{
writer.WriteProperty(RedmineKeys.ID, Id.ToString(CultureInfo.InvariantCulture));
}
diff --git a/src/redmine-net-api/Types/MyAccountCustomField.cs b/src/redmine-net-api/Types/MyAccountCustomField.cs
index a09a6bbe..ef00760f 100644
--- a/src/redmine-net-api/Types/MyAccountCustomField.cs
+++ b/src/redmine-net-api/Types/MyAccountCustomField.cs
@@ -104,7 +104,7 @@ public override void ReadJson(JsonReader reader)
}
///
- public override void WriteJson(JsonWriter writer)
+ public override void WriteJson(JsonWriter writer, bool full = false)
{
}
diff --git a/src/redmine-net-api/Types/News.cs b/src/redmine-net-api/Types/News.cs
index e5fbb3b4..5bd970b1 100644
--- a/src/redmine-net-api/Types/News.cs
+++ b/src/redmine-net-api/Types/News.cs
@@ -180,7 +180,8 @@ public override void ReadJson(JsonReader reader)
///
///
///
- public override void WriteJson(JsonWriter writer)
+ ///
+ public override void WriteJson(JsonWriter writer, bool full = false)
{
using (new JsonObject(writer, RedmineKeys.NEWS))
{
diff --git a/src/redmine-net-api/Types/NewsComment.cs b/src/redmine-net-api/Types/NewsComment.cs
index 48496829..4bd8995e 100644
--- a/src/redmine-net-api/Types/NewsComment.cs
+++ b/src/redmine-net-api/Types/NewsComment.cs
@@ -94,7 +94,7 @@ public override void ReadJson(JsonReader reader)
}
///
- public override void WriteJson(JsonWriter writer)
+ public override void WriteJson(JsonWriter writer, bool full = false)
{
}
diff --git a/src/redmine-net-api/Types/Permission.cs b/src/redmine-net-api/Types/Permission.cs
index 13fb4e9d..19a011cf 100644
--- a/src/redmine-net-api/Types/Permission.cs
+++ b/src/redmine-net-api/Types/Permission.cs
@@ -99,7 +99,8 @@ public void ReadJson(JsonReader reader)
///
///
///
- public void WriteJson(JsonWriter writer) { }
+ ///
+ public void WriteJson(JsonWriter writer, bool full = false) { }
#endregion
#region Implementation of IEquatable
diff --git a/src/redmine-net-api/Types/Project.cs b/src/redmine-net-api/Types/Project.cs
index 44dd0c0d..5cef1301 100644
--- a/src/redmine-net-api/Types/Project.cs
+++ b/src/redmine-net-api/Types/Project.cs
@@ -269,7 +269,8 @@ public override void ReadJson(JsonReader reader)
///
///
///
- public override void WriteJson(JsonWriter writer)
+ ///
+ public override void WriteJson(JsonWriter writer, bool full = false)
{
using (new JsonObject(writer, RedmineKeys.PROJECT))
{
diff --git a/src/redmine-net-api/Types/ProjectMembership.cs b/src/redmine-net-api/Types/ProjectMembership.cs
index 8ed99f79..85f983d8 100644
--- a/src/redmine-net-api/Types/ProjectMembership.cs
+++ b/src/redmine-net-api/Types/ProjectMembership.cs
@@ -142,7 +142,8 @@ public override void ReadJson(JsonReader reader)
///
///
///
- public override void WriteJson(JsonWriter writer)
+ ///
+ public override void WriteJson(JsonWriter writer, bool full = false)
{
using (new JsonObject(writer, RedmineKeys.MEMBERSHIP))
{
diff --git a/src/redmine-net-api/Types/Search.cs b/src/redmine-net-api/Types/Search.cs
index d9355764..5fb067bd 100644
--- a/src/redmine-net-api/Types/Search.cs
+++ b/src/redmine-net-api/Types/Search.cs
@@ -87,7 +87,7 @@ public void WriteXml(XmlWriter writer)
}
///
- public void WriteJson(JsonWriter writer)
+ public void WriteJson(JsonWriter writer, bool full = false)
{
}
diff --git a/src/redmine-net-api/Types/TimeEntry.cs b/src/redmine-net-api/Types/TimeEntry.cs
index 1a088178..715b1628 100644
--- a/src/redmine-net-api/Types/TimeEntry.cs
+++ b/src/redmine-net-api/Types/TimeEntry.cs
@@ -202,7 +202,8 @@ public override void ReadJson(JsonReader reader)
///
///
///
- public override void WriteJson(JsonWriter writer)
+ ///
+ public override void WriteJson(JsonWriter writer, bool full = false)
{
using (new JsonObject(writer, RedmineKeys.TIME_ENTRY))
{
diff --git a/src/redmine-net-api/Types/Upload.cs b/src/redmine-net-api/Types/Upload.cs
index 42b25a75..4c8c6f4d 100644
--- a/src/redmine-net-api/Types/Upload.cs
+++ b/src/redmine-net-api/Types/Upload.cs
@@ -140,7 +140,8 @@ public void ReadJson(JsonReader reader)
///
///
///
- public void WriteJson(JsonWriter writer)
+ ///
+ public void WriteJson(JsonWriter writer, bool full = false)
{
writer.WriteStartObject();
writer.WriteProperty(RedmineKeys.TOKEN, Token);
diff --git a/src/redmine-net-api/Types/User.cs b/src/redmine-net-api/Types/User.cs
index 7a93bfcf..46f4dd3d 100644
--- a/src/redmine-net-api/Types/User.cs
+++ b/src/redmine-net-api/Types/User.cs
@@ -279,7 +279,8 @@ public override void ReadJson(JsonReader reader)
///
///
///
- public override void WriteJson(JsonWriter writer)
+ ///
+ public override void WriteJson(JsonWriter writer, bool full = false)
{
using (new JsonObject(writer, RedmineKeys.USER))
{
diff --git a/src/redmine-net-api/Types/Version.cs b/src/redmine-net-api/Types/Version.cs
index e094ee27..07b1f007 100644
--- a/src/redmine-net-api/Types/Version.cs
+++ b/src/redmine-net-api/Types/Version.cs
@@ -197,7 +197,8 @@ public override void ReadJson(JsonReader reader)
///
///
///
- public override void WriteJson(JsonWriter writer)
+ ///
+ public override void WriteJson(JsonWriter writer, bool full = false)
{
using (new JsonObject(writer, RedmineKeys.VERSION))
{
diff --git a/src/redmine-net-api/Types/WikiPage.cs b/src/redmine-net-api/Types/WikiPage.cs
index bba1fcf7..f973b953 100644
--- a/src/redmine-net-api/Types/WikiPage.cs
+++ b/src/redmine-net-api/Types/WikiPage.cs
@@ -183,7 +183,8 @@ public override void ReadJson(JsonReader reader)
///
///
///
- public override void WriteJson(JsonWriter writer)
+ ///
+ public override void WriteJson(JsonWriter writer, bool full = false)
{
using (new JsonObject(writer, RedmineKeys.WIKI_PAGE))
{
diff --git a/tests/redmine-net-api.Tests/Tests/Sync/IssueTests.cs b/tests/redmine-net-api.Tests/Tests/Sync/IssueTests.cs
index ab3b58bd..fe22735d 100644
--- a/tests/redmine-net-api.Tests/Tests/Sync/IssueTests.cs
+++ b/tests/redmine-net-api.Tests/Tests/Sync/IssueTests.cs
@@ -1,6 +1,8 @@
using System;
using System.Collections.Generic;
using System.Collections.Specialized;
+using System.IO;
+using Newtonsoft.Json;
using Padi.RedmineApi.Tests.Infrastructure;
using Redmine.Net.Api;
using Redmine.Net.Api.Exceptions;
@@ -316,6 +318,42 @@ public void Should_Clone_Issue()
Assert.True(issueToClone.CustomFields.Count != clonedIssue.CustomFields.Count);
}
+ [Fact, Order(15)]
+ public void Should_Issue_Be_Equal()
+ {
+ const string ISSUE_ID = "96";
+
+ var issue = fixture.RedmineManager.GetObject(ISSUE_ID, new NameValueCollection
+ {
+ { RedmineKeys.INCLUDE, $"{RedmineKeys.CHILDREN},{RedmineKeys.ATTACHMENTS},{RedmineKeys.RELATIONS},{RedmineKeys.CHANGE_SETS},{RedmineKeys.JOURNALS},{RedmineKeys.WATCHERS}" }
+ });
+
+ Assert.NotNull(issue);
+
+ var json = string.Empty;
+ using (var swriter = new StringWriter())
+ {
+ using (var writer = new JsonTextWriter(swriter))
+ {
+ issue.WriteJson(writer);
+ json = swriter.ToString();
+ Assert.False(string.IsNullOrWhiteSpace(json));
+ }
+ }
+
+ using (var sreader = new StringReader(json))
+ {
+ using (var reader = new JsonTextReader(sreader))
+ {
+ var issue2 = new Issue();
+ issue2.ReadJson(reader);
+ Assert.Equal(issue, issue2);
+ }
+ }
+
+ }
+
+
[Fact]
public void Should_Get_Issue_With_Hours()
{