From 52d54d50e7772fc9936365abe53a392cc5f6acf5 Mon Sep 17 00:00:00 2001 From: James Newton-King Date: Mon, 3 Nov 2014 16:10:08 -0800 Subject: [PATCH] -Fixed deserializing complex values inside multi-dimensional arrays --- .../Serialization/ExtensionDataTests.cs | 2 +- .../JsonSerializerCollectionsTests.cs | 46 +++++++++++++++++++ .../Utilities/CollectionUtils.cs | 9 +++- 3 files changed, 54 insertions(+), 3 deletions(-) diff --git a/Src/Newtonsoft.Json.Tests/Serialization/ExtensionDataTests.cs b/Src/Newtonsoft.Json.Tests/Serialization/ExtensionDataTests.cs index 07f76e5e..14dadf77 100644 --- a/Src/Newtonsoft.Json.Tests/Serialization/ExtensionDataTests.cs +++ b/Src/Newtonsoft.Json.Tests/Serialization/ExtensionDataTests.cs @@ -144,7 +144,7 @@ namespace Newtonsoft.Json.Tests.Serialization } [Test] - public void Sdfsdf() + public void DataBagDoesNotInheritFromDictionaryClass() { Example e = new Example(); e.Data.Add("extensionData1", new int[] { 1, 2, 3 }); diff --git a/Src/Newtonsoft.Json.Tests/Serialization/JsonSerializerCollectionsTests.cs b/Src/Newtonsoft.Json.Tests/Serialization/JsonSerializerCollectionsTests.cs index e9cd4f04..3c7646ce 100644 --- a/Src/Newtonsoft.Json.Tests/Serialization/JsonSerializerCollectionsTests.cs +++ b/Src/Newtonsoft.Json.Tests/Serialization/JsonSerializerCollectionsTests.cs @@ -57,6 +57,52 @@ namespace Newtonsoft.Json.Tests.Serialization [TestFixture] public class JsonSerializerCollectionsTests : TestFixtureBase { + [Test] + public void MultiDObjectArray() + { + object[,] myOtherArray = + { + { new KeyValuePair("my value", 0.8), "foobar" }, + { true, 0.4d }, + { 0.05f, 6 } + }; + + string myOtherArrayAsString = JsonConvert.SerializeObject(myOtherArray, Formatting.Indented); + + Assert.AreEqual(@"[ + [ + { + ""Key"": ""my value"", + ""Value"": 0.8 + }, + ""foobar"" + ], + [ + true, + 0.4 + ], + [ + 0.05, + 6 + ] +]", myOtherArrayAsString); + + JObject o = JObject.Parse(@"{ + ""Key"": ""my value"", + ""Value"": 0.8 + }"); + + object[,] myOtherResult = JsonConvert.DeserializeObject(myOtherArrayAsString); + Assert.IsTrue(JToken.DeepEquals(o, (JToken)myOtherResult[0, 0])); + Assert.AreEqual("foobar", myOtherResult[0, 1]); + + Assert.AreEqual(true, myOtherResult[1, 0]); + Assert.AreEqual(0.4, myOtherResult[1, 1]); + + Assert.AreEqual(0.05, myOtherResult[2, 0]); + Assert.AreEqual(6, myOtherResult[2, 1]); + } + public class EnumerableClass : IEnumerable { private readonly IList _values; diff --git a/Src/Newtonsoft.Json/Utilities/CollectionUtils.cs b/Src/Newtonsoft.Json/Utilities/CollectionUtils.cs index 338b132c..92361733 100644 --- a/Src/Newtonsoft.Json/Utilities/CollectionUtils.cs +++ b/Src/Newtonsoft.Json/Utilities/CollectionUtils.cs @@ -212,7 +212,7 @@ namespace Newtonsoft.Json.Utilities return -1; } - private static IList GetDimensions(IList values) + private static IList GetDimensions(IList values, int dimensionsCount) { IList dimensions = new List(); @@ -220,6 +220,11 @@ namespace Newtonsoft.Json.Utilities while (true) { dimensions.Add(currentArray.Count); + + // don't keep calculating dimensions for arrays inside the value array + if (dimensions.Count == dimensionsCount) + break; + if (currentArray.Count == 0) break; @@ -277,7 +282,7 @@ namespace Newtonsoft.Json.Utilities public static Array ToMultidimensionalArray(IList values, Type type, int rank) { - IList dimensions = GetDimensions(values); + IList dimensions = GetDimensions(values, rank); while (dimensions.Count < rank) {