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

Commit a14c230

Browse files
authored
Fix List primitive to/from CSV so that same input gets the same output. (#532)
1 parent 4ca3f23 commit a14c230

File tree

2 files changed

+54
-0
lines changed

2 files changed

+54
-0
lines changed

src/ServiceStack.Text/CsvReader.cs

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -272,6 +272,21 @@ private static List<T> GetSingleRow(IEnumerable<string> rows, Type recordType)
272272
return row;
273273
}
274274

275+
private static List<T> ParseSingleRow(string row, Type recordType)
276+
{
277+
var results = new List<T>();
278+
var itemRows = CsvReader.ParseFields(row);
279+
foreach (var itemRow in itemRows)
280+
{
281+
var to = recordType == typeof(string)
282+
? (T)(object)itemRow
283+
: TypeSerializer.DeserializeFromString<T>(itemRow);
284+
285+
results.Add(to);
286+
}
287+
return results;
288+
}
289+
275290
public static List<T> GetRows(IEnumerable<string> records)
276291
{
277292
var rows = new List<T>();
@@ -360,6 +375,11 @@ public static List<T> Read(List<string> rows)
360375
headers = CsvReader.ParseFields(rows[0], s => s.Trim());
361376
}
362377

378+
if (typeof(T).IsValueType || (typeof(T) == typeof(string)) && rows.Count == 1)
379+
{
380+
return ParseSingleRow(rows[0], typeof(T));
381+
}
382+
363383
if (typeof(T).IsValueType || typeof(T) == typeof(string))
364384
{
365385
return GetSingleRow(rows, typeof(T));

tests/ServiceStack.Text.Tests/CsvTests/ObjectSerializerTests.cs

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -191,6 +191,40 @@ public void Can_serialize_text_with_unmatched_list_or_map_chars()
191191
Assert.That(des[0].Prop4, Is.EqualTo(src[0].Prop4));
192192
Assert.That(des[0].Prop5, Is.EqualTo(src[0].Prop5));
193193
}
194+
195+
[Test]
196+
public void Can_serialize_csv_and_deserialize_List_string()
197+
{
198+
var list = new List<string>
199+
{
200+
"one",
201+
"two",
202+
"three"
203+
};
204+
205+
var flatList = list.ToCsv();
206+
207+
var originalList = flatList.FromCsv<List<string>>();
208+
209+
Assert.That(originalList.Count, Is.EqualTo(3));
210+
}
211+
212+
[Test]
213+
public void Can_serialize_csv_and_deserialize_List_primitives()
214+
{
215+
var list = new List<int>
216+
{
217+
1,
218+
2,
219+
3
220+
};
221+
222+
var flatList = list.ToCsv();
223+
224+
var originalList = flatList.FromCsv<List<int>>();
225+
226+
Assert.That(originalList.Count, Is.EqualTo(3));
227+
}
194228
}
195229

196230
public class POCO

0 commit comments

Comments
 (0)