using System.Collections.Generic;
using Console = System.Console;
using Environment = System.Environment;
using StringComparison = System.StringComparison;
public static void Test()
Test(Enumerable.Range(0, 4).Select(i => new { Value = "Hello \n" + i.ToString() }));
Test(Enumerable.Range(0, 4).Select(i => Newtonsoft.Json.Linq.JObject.FromObject(new { Value = "Hello " + i.ToString(), NewLine = Environment.NewLine })));
Console.WriteLine("Done");
static void Test<T>(IEnumerable<T> items)
Console.WriteLine(string.Format("Testing items of type {0}", typeof(T)));
var sb = new StringBuilder();
using (var textWriter = new StringWriter(sb))
JsonExtensions.ToNewlineDelimitedJson(textWriter, items);
var json = sb.ToString();
var newItems = JsonExtensions.FromNewlineDelimitedJson<T>(new StringReader(json)).ToList();
Assert.IsTrue(newItems.Count == items.Count());
Assert.IsTrue(newItems.Count == json.CountSubstrings("\n"));
Console.WriteLine("Serialized JSON has the correct count of items and lines: {0}", newItems.Count);
public static partial class JsonExtensions
public static void ToNewlineDelimitedJson<T>(Stream stream, IEnumerable<T> items)
using (var textWriter = new StreamWriter(stream, new UTF8Encoding(false, true), 1024, true))
ToNewlineDelimitedJson(textWriter, items);
public static void ToNewlineDelimitedJson<T>(TextWriter textWriter, IEnumerable<T> items)
var serializer = JsonSerializer.CreateDefault();
foreach (var item in items)
using (var writer = new JsonTextWriter(textWriter) { Formatting = Formatting.None, CloseOutput = false })
serializer.Serialize(writer, item);
public static partial class JsonExtensions
public static IEnumerable<T> FromNewlineDelimitedJson<T>(TextReader reader)
using (var jsonReader = new JsonTextReader(reader) { CloseInput = false, SupportMultipleContent = true })
var serializer = JsonSerializer.CreateDefault();
while (jsonReader.Read())
if (jsonReader.TokenType == JsonToken.Comment)
yield return serializer.Deserialize<T>(jsonReader);
public class AssertionFailedException : System.Exception
public AssertionFailedException() : base() { }
public AssertionFailedException(string s) : base(s) { }
public static class Assert
public static void IsTrue(bool value)
throw new AssertionFailedException("failed");
public static class TextExtensions
public static int CountSubstrings(this string source, string substring)
while ((n = source.IndexOf(substring, n, StringComparison.InvariantCulture)) != -1)
public static void Main()
Console.WriteLine("Environment version: " + Environment.Version);
Console.WriteLine("Json.NET version: " + typeof(JsonSerializer).Assembly.FullName);