diff --git a/Box.V2.Test/Box.V2.Test.csproj b/Box.V2.Test/Box.V2.Test.csproj
index eb37744b5..a3c2d717c 100644
--- a/Box.V2.Test/Box.V2.Test.csproj
+++ b/Box.V2.Test/Box.V2.Test.csproj
@@ -87,6 +87,18 @@
PreserveNewest
+
+ PreserveNewest
+
+
+ PreserveNewest
+
+
+ PreserveNewest
+
+
+ PreserveNewest
+
PreserveNewest
diff --git a/Box.V2.Test/Converters/SingleOrCollectionConverterTest.cs b/Box.V2.Test/Converters/SingleOrCollectionConverterTest.cs
new file mode 100644
index 000000000..e32a2c677
--- /dev/null
+++ b/Box.V2.Test/Converters/SingleOrCollectionConverterTest.cs
@@ -0,0 +1,50 @@
+using Box.V2.Converter;
+using Box.V2.Models;
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+
+namespace Box.V2.Test
+{
+ [TestClass]
+ public class SingleOrCollectionConverterTest : BoxResourceManagerTest
+ {
+ private readonly IBoxConverter _converter;
+
+ public SingleOrCollectionConverterTest()
+ {
+ _converter = new BoxJsonConverter();
+ }
+
+ [TestMethod]
+ public void SingleObject()
+ {
+ var json = LoadFixtureFromJson("Fixtures/Converters/SingleOrCollectionConverter/SingleObject.json");
+ var error = _converter.Parse>(json);
+ Assert.AreEqual(error.Conflicts[0].Name, "Test Folder");
+ }
+
+ [TestMethod]
+ public void Array()
+ {
+ var json = LoadFixtureFromJson("Fixtures/Converters/SingleOrCollectionConverter/Array.json");
+ var error = _converter.Parse>(json);
+ Assert.AreEqual(error.Conflicts[0].Name, "Test Folder");
+ Assert.AreEqual(error.Conflicts[1].Name, "Test Folder 2");
+ }
+
+ [TestMethod]
+ public void EmptyArray()
+ {
+ var json = LoadFixtureFromJson("Fixtures/Converters/SingleOrCollectionConverter/EmptyArray.json");
+ var error = _converter.Parse>(json);
+ Assert.AreEqual(error.Conflicts.Count, 0);
+ }
+
+ [TestMethod]
+ public void Empty()
+ {
+ var json = LoadFixtureFromJson("Fixtures/Converters/SingleOrCollectionConverter/Empty.json");
+ var error = _converter.Parse>(json);
+ Assert.IsNull(error.Conflicts);
+ }
+ }
+}
diff --git a/Box.V2.Test/Fixtures/Converters/SingleOrCollectionConverter/Array.json b/Box.V2.Test/Fixtures/Converters/SingleOrCollectionConverter/Array.json
new file mode 100644
index 000000000..43b1b19c1
--- /dev/null
+++ b/Box.V2.Test/Fixtures/Converters/SingleOrCollectionConverter/Array.json
@@ -0,0 +1,18 @@
+{
+ "conflicts": [
+ {
+ "type": "folder",
+ "id": "123",
+ "sequence_id": "0",
+ "etag": "0",
+ "name": "Test Folder"
+ },
+ {
+ "type": "folder",
+ "id": "124",
+ "sequence_id": "0",
+ "etag": "0",
+ "name": "Test Folder 2"
+ }
+ ]
+}
diff --git a/Box.V2.Test/Fixtures/Converters/SingleOrCollectionConverter/Empty.json b/Box.V2.Test/Fixtures/Converters/SingleOrCollectionConverter/Empty.json
new file mode 100644
index 000000000..2c63c0851
--- /dev/null
+++ b/Box.V2.Test/Fixtures/Converters/SingleOrCollectionConverter/Empty.json
@@ -0,0 +1,2 @@
+{
+}
diff --git a/Box.V2.Test/Fixtures/Converters/SingleOrCollectionConverter/EmptyArray.json b/Box.V2.Test/Fixtures/Converters/SingleOrCollectionConverter/EmptyArray.json
new file mode 100644
index 000000000..62463aabc
--- /dev/null
+++ b/Box.V2.Test/Fixtures/Converters/SingleOrCollectionConverter/EmptyArray.json
@@ -0,0 +1,4 @@
+{
+ "conflicts": [
+ ]
+}
diff --git a/Box.V2.Test/Fixtures/Converters/SingleOrCollectionConverter/SingleObject.json b/Box.V2.Test/Fixtures/Converters/SingleOrCollectionConverter/SingleObject.json
new file mode 100644
index 000000000..069c98831
--- /dev/null
+++ b/Box.V2.Test/Fixtures/Converters/SingleOrCollectionConverter/SingleObject.json
@@ -0,0 +1,9 @@
+{
+ "conflicts": {
+ "type": "folder",
+ "id": "123",
+ "sequence_id": "0",
+ "etag": "0",
+ "name": "Test Folder"
+ }
+}
diff --git a/Box.V2/Wrappers/BoxErrorContextInfo.cs b/Box.V2/Wrappers/BoxErrorContextInfo.cs
index be02eeeb6..72a4d721f 100644
--- a/Box.V2/Wrappers/BoxErrorContextInfo.cs
+++ b/Box.V2/Wrappers/BoxErrorContextInfo.cs
@@ -1,5 +1,8 @@
+using System;
using System.Collections.ObjectModel;
using Newtonsoft.Json;
+using Newtonsoft.Json.Linq;
+using Newtonsoft.Json.Serialization;
namespace Box.V2
{
@@ -14,6 +17,8 @@ public class BoxConflictErrorContextInfo where T : class
///
/// The conflicts.
[JsonProperty(PropertyName = "conflicts")]
+ //in case of copyFolder conflict object is returned instead of an array
+ [JsonConverter(typeof(SingleOrCollectionConverter))]
public Collection Conflicts { get; set; }
}
@@ -30,4 +35,26 @@ public class BoxPreflightCheckConflictErrorContextInfo where T : class
[JsonProperty(PropertyName = "conflicts")]
public T Conflict { get; set; }
}
+
+
+ internal class SingleOrCollectionConverter : JsonConverter
+ {
+ public override bool CanConvert(Type objectType) => true;
+
+ public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
+ {
+ var jToken = serializer.Deserialize(reader);
+
+ return jToken is JArray ?
+ jToken.ToObject(objectType, serializer) :
+ new JArray(jToken).ToObject(objectType, serializer);
+ }
+
+ public override bool CanWrite => false;
+
+ public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
+ {
+ throw new NotImplementedException();
+ }
+ }
}