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

Commit

Permalink
Add support for serializing dynamic generic IDictionary's to CSV
Browse files Browse the repository at this point in the history
  • Loading branch information
mythz committed Aug 28, 2015
1 parent 7a75f6b commit 18cab8b
Show file tree
Hide file tree
Showing 4 changed files with 33 additions and 10 deletions.
14 changes: 10 additions & 4 deletions src/ServiceStack.Text/CsvWriter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ public static void WriteObjectRow(TextWriter writer, IEnumerable<object> row)
writer.Write(CsvConfig.RowSeparatorString);
}

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

Expand All @@ -49,7 +49,7 @@ public static void Write(TextWriter writer, IEnumerable<Dictionary<string, objec
}
}

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

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

if (typeof(T) == typeof(Dictionary<string, string>))
if (typeof(T) == typeof(Dictionary<string, string>) || typeof(T) == typeof(IDictionary<string, string>))
{
CsvDictionaryWriter.Write(writer, (IEnumerable<Dictionary<string, string>>)records);
CsvDictionaryWriter.Write(writer, (IEnumerable<IDictionary<string, string>>)records);
return;
}

if (typeof(T) == typeof(Dictionary<string, object>) || typeof(T) == typeof(IDictionary<string, object>))
{
CsvDictionaryWriter.Write(writer, (IEnumerable<IDictionary<string, object>>)records);
return;
}

Expand Down
4 changes: 4 additions & 0 deletions src/ServiceStack.Text/ReflectionExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -1852,6 +1852,10 @@ public void SetValue(object instance, object value)
if (alreadyDict != null)
return alreadyDict;

var interfaceDict = obj as IDictionary<string, object>;
if (interfaceDict != null)
return new Dictionary<string, object>(interfaceDict);

var type = obj.GetType();

ObjectDictionaryDefinition def;
Expand Down
7 changes: 7 additions & 0 deletions src/ServiceStack.Text/StringExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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)
{
Expand Down
18 changes: 12 additions & 6 deletions tests/ServiceStack.Text.Tests/DynamicJsonTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,24 +6,30 @@ 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]
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));
}
}
}

0 comments on commit 18cab8b

Please sign in to comment.