using System.Collections;
using System.Collections.Generic;
using System.Runtime.Serialization.Formatters;
using System.ComponentModel.DataAnnotations;
using System.Globalization;
using Newtonsoft.Json.Linq;
using Newtonsoft.Json.Converters;
using Newtonsoft.Json.Serialization;
public double[,] PressureMatrix { get; set; }
public class CalibrationConfiguration
public class RepresentationConfiguration
public class RecordedDataHeader
public string SoftwareVersion { get; set; }
public CalibrationConfiguration CalibrationConfiguration { get; set; }
public RepresentationConfiguration RepresentationConfiguration { get; set; }
public class RecordedData
[JsonProperty(Order = 1)]
public RecordedDataHeader RecordedDataHeader { get; set; }
[JsonProperty(Order = 2)]
public IEnumerable<PressureMap> PressureData { get; set; }
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 IEnumerable<TBase> FromNewlineDelimitedJson<TBase, THeader, TRow>(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<THeader>(jsonReader);
yield return serializer.Deserialize<TRow>(jsonReader);
public static void Test()
var filePath = "Question52311362.json";
new TestClass { filePath = filePath }.SampleAndWritePressureData();
using (var stream = File.OpenRead(filePath))
using (var textReader = new StreamReader(stream))
foreach (var obj in JsonExtensions.FromNewlineDelimitedJson<object, RecordedDataHeader, PressureMap>(textReader))
if (obj is RecordedDataHeader)
var header = (RecordedDataHeader)obj;
Console.WriteLine(JsonConvert.SerializeObject(header));
var row = (PressureMap)obj;
Console.WriteLine(JsonConvert.SerializeObject(row));
public void SampleAndWritePressureData()
var calibrationConfiguration = new CalibrationConfiguration();
var representationConfiguration = new RepresentationConfiguration();
var softwareVersion = Assembly.GetExecutingAssembly().GetName().Version.Major.ToString() + "." + Assembly.GetExecutingAssembly().GetName().Version.Minor.ToString();
var recordedDataHeader = new RecordedDataHeader
SoftwareVersion = softwareVersion,
CalibrationConfiguration = calibrationConfiguration,
RepresentationConfiguration = representationConfiguration,
var settings = new JsonSerializerSettings
ContractResolver = new CamelCasePropertyNamesContractResolver(),
Console.WriteLine("Beginning serialization of sample data to {0}.", this.filePath);
using (var stream = new FileStream(this.filePath, FileMode.Create))
JsonExtensions.ToNewlineDelimitedJson(stream, new[] { recordedDataHeader });
for (int i = 0; i < sampleCount; i++)
Thread.Sleep(sampleInterval);
Console.WriteLine("Performing sample {0} of {1}", i, sampleCount);
var map = GetPressureMap(i);
using (var stream = new FileStream(this.filePath, FileMode.Append))
JsonExtensions.ToNewlineDelimitedJson(stream, new[] { map });
Console.WriteLine("Finished serialization of sample data to {0}.", this.filePath);
PressureMap GetPressureMap(int count)
PressureMatrix = new double[,] { { (double)count } }
public static void Main()
Console.WriteLine("Environment version: " + Environment.Version);
Console.WriteLine("Json.NET version: " + typeof(JsonSerializer).Assembly.FullName);
Console.WriteLine("Failed with unhandled exception: ");