Skip to content
This repository was archived by the owner on Dec 24, 2022. It is now read-only.

Commit 18cab8b

Browse files
committed
Add support for serializing dynamic generic IDictionary's to CSV
1 parent 7a75f6b commit 18cab8b

File tree

4 files changed

+33
-10
lines changed

4 files changed

+33
-10
lines changed

src/ServiceStack.Text/CsvWriter.cs

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ public static void WriteObjectRow(TextWriter writer, IEnumerable<object> row)
3333
writer.Write(CsvConfig.RowSeparatorString);
3434
}
3535

36-
public static void Write(TextWriter writer, IEnumerable<Dictionary<string, object>> records)
36+
public static void Write(TextWriter writer, IEnumerable<IDictionary<string, object>> records)
3737
{
3838
if (records == null) return; //AOT
3939

@@ -49,7 +49,7 @@ public static void Write(TextWriter writer, IEnumerable<Dictionary<string, objec
4949
}
5050
}
5151

52-
public static void Write(TextWriter writer, IEnumerable<Dictionary<string, string>> records)
52+
public static void Write(TextWriter writer, IEnumerable<IDictionary<string, string>> records)
5353
{
5454
if (records == null) return; //AOT
5555

@@ -221,9 +221,15 @@ public static void Write(TextWriter writer, IEnumerable<T> records)
221221
{
222222
if (writer == null) return; //AOT
223223

224-
if (typeof(T) == typeof(Dictionary<string, string>))
224+
if (typeof(T) == typeof(Dictionary<string, string>) || typeof(T) == typeof(IDictionary<string, string>))
225225
{
226-
CsvDictionaryWriter.Write(writer, (IEnumerable<Dictionary<string, string>>)records);
226+
CsvDictionaryWriter.Write(writer, (IEnumerable<IDictionary<string, string>>)records);
227+
return;
228+
}
229+
230+
if (typeof(T) == typeof(Dictionary<string, object>) || typeof(T) == typeof(IDictionary<string, object>))
231+
{
232+
CsvDictionaryWriter.Write(writer, (IEnumerable<IDictionary<string, object>>)records);
227233
return;
228234
}
229235

src/ServiceStack.Text/ReflectionExtensions.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1852,6 +1852,10 @@ public static Dictionary<string, object> ToObjectDictionary(this object obj)
18521852
if (alreadyDict != null)
18531853
return alreadyDict;
18541854

1855+
var interfaceDict = obj as IDictionary<string, object>;
1856+
if (interfaceDict != null)
1857+
return new Dictionary<string, object>(interfaceDict);
1858+
18551859
var type = obj.GetType();
18561860

18571861
ObjectDictionaryDefinition def;

src/ServiceStack.Text/StringExtensions.cs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -998,6 +998,13 @@ public static int CountOccurrencesOf(this string text, char needle)
998998
return count;
999999
}
10001000

1001+
public static string NormalizeNewLines(this string text)
1002+
{
1003+
return text != null
1004+
? text.Replace("\r\n", "\n")
1005+
: null;
1006+
}
1007+
10011008
#if !LITE
10021009
public static string HexEscape(this string text, params char[] anyCharOf)
10031010
{

tests/ServiceStack.Text.Tests/DynamicJsonTests.cs

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,24 +6,30 @@ namespace ServiceStack.Text.Tests
66
public class DynamicJsonTests
77
{
88
[Test]
9-
public void Can_serialize_dynamic_instance()
9+
public void Can_Serialize_dynamic_collection()
1010
{
11-
var dog = new { Name = "Spot" };
12-
var json = DynamicJson.Serialize(dog);
11+
dynamic rows = new[] { new { Name = "Foo" }, new { Name = "Bar" } };
12+
13+
string json = JsonSerializer.SerializeToString(rows);
1314

14-
Assert.IsNotNull(json);
15-
json.Print();
15+
Assert.That(json, Is.EqualTo("[{\"Name\":\"Foo\"},{\"Name\":\"Bar\"}]"));
16+
17+
string csv = CsvSerializer.SerializeToString(rows);
18+
Assert.That(csv.NormalizeNewLines(), Is.EqualTo("Name\nFoo\nBar\n"));
1619
}
1720

1821
[Test]
1922
public void Can_deserialize_dynamic_instance()
2023
{
2124
var dog = new { Name = "Spot" };
2225
var json = DynamicJson.Serialize(dog);
26+
27+
Assert.That(json, Is.EqualTo("{\"Name\":\"Spot\"}"));
28+
2329
var deserialized = DynamicJson.Deserialize(json);
2430

2531
Assert.IsNotNull(deserialized);
26-
Assert.AreEqual(dog.Name, deserialized.Name);
32+
Assert.That(deserialized.Name, Is.EqualTo(dog.Name));
2733
}
2834
}
2935
}

0 commit comments

Comments
 (0)