Serializar como NDJSON utilizando Json.NET

¿Es posible serializar a NDJSON (Newline Delimited JSON) utilizando Json.NET? La API de Elasticsearch utiliza NDJSON para operaciones masivas, y no puedo encontrar nada que sugiera que este formato sea compatible con las bibliotecas .NET.

Esta respuesta proporciona una guía para deserializar NDJSON, y se observó que uno podría serializar cada fila de forma independiente y unirse con la nueva línea, pero no necesariamente lo llamaría ” soporte” .

La respuesta más simple sería escribir en un único TextWriter usando un JsonTextWriter separado para cada línea, estableciendo CloseOutput = false para cada:

 public static partial class JsonExtensions { public static void ToNewlineDelimitedJson(Stream stream, IEnumerable items) { // Let caller dispose the underlying stream using (var textWriter = new StreamWriter(stream, new UTF8Encoding(false, true), 1024, true)) { ToNewlineDelimitedJson(textWriter, items); } } public static void ToNewlineDelimitedJson(TextWriter textWriter, IEnumerable items) { var serializer = JsonSerializer.CreateDefault(); foreach (var item in items) { // Formatting.None is the default; I set it here for clarity. using (var writer = new JsonTextWriter(textWriter) { Formatting = Formatting.None, CloseOutput = false }) { serializer.Serialize(writer, item); } // http://specs.okfnlabs.org/ndjson/ // Each JSON text MUST conform to the [RFC7159] standard and MUST be written to the stream followed by the newline character \n (0x0A). // The newline charater MAY be preceeded by a carriage return \r (0x0D). The JSON texts MUST NOT contain newlines or carriage returns. textWriter.Write("\n"); } } } 

Muestra de violín .

Como es probable que las líneas NDJSON individuales sean cortas, pero la cantidad de líneas puede ser grande, esta respuesta sugiere una solución de transmisión para evitar la necesidad de asignar una sola cadena de más de 85kb. Como se explica en Newtonsoft Json.NET Performance Tips , tales cadenas grandes terminan en el montón de objetos grandes y pueden degradar posteriormente el rendimiento de la aplicación.

Podrías probar esto:

 string ndJson = JsonConvert.SerializeObject(value, Formatting.Indented); 

pero ahora veo que no solo desea que el objeto serializado se imprima bastante. Si el objeto que está serializando es algún tipo de colección o enumeración, ¿no podría hacerlo usted mismo serializando cada elemento?

 StringBuilder sb = new StringBuilder(); foreach (var element in collection) { sb.AppendLine(JsonConvert.SerializeObject(element, Formatting.None)); } // use the NDJSON output Console.WriteLine(sb.ToString());