diff --git a/src/ServiceStack.Text/CsvWriter.cs b/src/ServiceStack.Text/CsvWriter.cs index 7c85ab7ed..f73706cf5 100644 --- a/src/ServiceStack.Text/CsvWriter.cs +++ b/src/ServiceStack.Text/CsvWriter.cs @@ -33,7 +33,7 @@ public static void WriteObjectRow(TextWriter writer, IEnumerable row) writer.Write(CsvConfig.RowSeparatorString); } - public static void Write(TextWriter writer, IEnumerable> records) + public static void Write(TextWriter writer, IEnumerable> records) { if (records == null) return; //AOT @@ -49,7 +49,7 @@ public static void Write(TextWriter writer, IEnumerable> records) + public static void Write(TextWriter writer, IEnumerable> records) { if (records == null) return; //AOT @@ -221,9 +221,15 @@ public static void Write(TextWriter writer, IEnumerable records) { if (writer == null) return; //AOT - if (typeof(T) == typeof(Dictionary)) + if (typeof(T) == typeof(Dictionary) || typeof(T) == typeof(IDictionary)) { - CsvDictionaryWriter.Write(writer, (IEnumerable>)records); + CsvDictionaryWriter.Write(writer, (IEnumerable>)records); + return; + } + + if (typeof(T) == typeof(Dictionary) || typeof(T) == typeof(IDictionary)) + { + CsvDictionaryWriter.Write(writer, (IEnumerable>)records); return; } diff --git a/src/ServiceStack.Text/ReflectionExtensions.cs b/src/ServiceStack.Text/ReflectionExtensions.cs index f72e4c567..8c9b6ab09 100644 --- a/src/ServiceStack.Text/ReflectionExtensions.cs +++ b/src/ServiceStack.Text/ReflectionExtensions.cs @@ -1852,6 +1852,10 @@ public void SetValue(object instance, object value) if (alreadyDict != null) return alreadyDict; + var interfaceDict = obj as IDictionary; + if (interfaceDict != null) + return new Dictionary(interfaceDict); + var type = obj.GetType(); ObjectDictionaryDefinition def; diff --git a/src/ServiceStack.Text/StringExtensions.cs b/src/ServiceStack.Text/StringExtensions.cs index 7e514d207..f66823534 100644 --- a/src/ServiceStack.Text/StringExtensions.cs +++ b/src/ServiceStack.Text/StringExtensions.cs @@ -998,6 +998,13 @@ public static int CountOccurrencesOf(this string text, char needle) return count; } + public static string NormalizeNewLines(this string text) + { + return text != null + ? text.Replace("\r\n", "\n") + : null; + } + #if !LITE public static string HexEscape(this string text, params char[] anyCharOf) { diff --git a/tests/ServiceStack.Text.Tests/DynamicJsonTests.cs b/tests/ServiceStack.Text.Tests/DynamicJsonTests.cs index 92fa687e3..536df2911 100644 --- a/tests/ServiceStack.Text.Tests/DynamicJsonTests.cs +++ b/tests/ServiceStack.Text.Tests/DynamicJsonTests.cs @@ -6,13 +6,16 @@ namespace ServiceStack.Text.Tests public class DynamicJsonTests { [Test] - public void Can_serialize_dynamic_instance() + public void Can_Serialize_dynamic_collection() { - var dog = new { Name = "Spot" }; - var json = DynamicJson.Serialize(dog); + dynamic rows = new[] { new { Name = "Foo" }, new { Name = "Bar" } }; + + string json = JsonSerializer.SerializeToString(rows); - Assert.IsNotNull(json); - json.Print(); + Assert.That(json, Is.EqualTo("[{\"Name\":\"Foo\"},{\"Name\":\"Bar\"}]")); + + string csv = CsvSerializer.SerializeToString(rows); + Assert.That(csv.NormalizeNewLines(), Is.EqualTo("Name\nFoo\nBar\n")); } [Test] @@ -20,10 +23,13 @@ public void Can_deserialize_dynamic_instance() { var dog = new { Name = "Spot" }; var json = DynamicJson.Serialize(dog); + + Assert.That(json, Is.EqualTo("{\"Name\":\"Spot\"}")); + var deserialized = DynamicJson.Deserialize(json); Assert.IsNotNull(deserialized); - Assert.AreEqual(dog.Name, deserialized.Name); + Assert.That(deserialized.Name, Is.EqualTo(dog.Name)); } } }