From 3586cf8fbabcfa9ca39938967c98689d610503a6 Mon Sep 17 00:00:00 2001 From: Ryan Griffith Date: Mon, 18 Nov 2013 13:17:09 -0800 Subject: [PATCH 1/2] Added support for JsonArray deserialization --- RestSharp/Deserializers/JsonDeserializer.cs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/RestSharp/Deserializers/JsonDeserializer.cs b/RestSharp/Deserializers/JsonDeserializer.cs index 3dff63860..dab3cc459 100644 --- a/RestSharp/Deserializers/JsonDeserializer.cs +++ b/RestSharp/Deserializers/JsonDeserializer.cs @@ -254,6 +254,11 @@ private object ConvertValue(Type type, object value) return CreateAndMap(type, value); } } + else if (type.IsSubclassOfRawGeneric(typeof(List<>))) + { + // handles classes that derive from List + return BuildList(type, value); + } else { // nested property classes From 708adc5f01af27dbe4e9d50794d3634968ee6e64 Mon Sep 17 00:00:00 2001 From: Ryan Griffith Date: Mon, 18 Nov 2013 13:17:09 -0800 Subject: [PATCH 2/2] JsonDeserializer now can deserialize objects JsonArray and JsonObject when their target type is specified as "System.Object" instead of a more specific type. * The side effect of this is that now you can recursively deserialize a JSON object that has mixed value types by specifying Dictionary as the deserialization target. --- RestSharp.Tests/JsonTests.cs | 14 ++++++++++++++ RestSharp/Deserializers/JsonDeserializer.cs | 12 +++++++++++- 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/RestSharp.Tests/JsonTests.cs b/RestSharp.Tests/JsonTests.cs index 4d8ce03be..a7d2b54ba 100644 --- a/RestSharp.Tests/JsonTests.cs +++ b/RestSharp.Tests/JsonTests.cs @@ -125,6 +125,20 @@ public void Can_Deserialize_From_Root_Element() Assert.Equal("John Sheehan", output.DisplayName); } + [Fact] + public void Can_Deserialize_To_Dictionary_String_Object() { + var doc = File.ReadAllText(Path.Combine("SampleData", "jsondictionary.txt")); + + var json = new JsonDeserializer(); + + var output = json.Deserialize>(new RestResponse() { Content = doc }); + + Assert.Equal(output.Keys.Count, 3); + + var firstKeysVal = output.FirstOrDefault().Value; + Assert.IsAssignableFrom(firstKeysVal); + } + [Fact] public void Can_Deserialize_Generic_Members() { diff --git a/RestSharp/Deserializers/JsonDeserializer.cs b/RestSharp/Deserializers/JsonDeserializer.cs index e1df80610..06fd1d66f 100644 --- a/RestSharp/Deserializers/JsonDeserializer.cs +++ b/RestSharp/Deserializers/JsonDeserializer.cs @@ -267,7 +267,17 @@ private object ConvertValue(Type type, object value) return CreateAndMap(type, value); } } - else + else if (type.IsSubclassOfRawGeneric(typeof(List<>))) + { + // handles classes that derive from List + return BuildList(type, value); + } + else if (type == typeof(JsonObject)) + { + // simplify JsonObject into a Dictionary + return BuildDictionary(typeof(Dictionary), value); + } + else { // nested property classes return CreateAndMap(type, value);