Als NDJSON mit Json.NET serialisieren

Als NDJSON mit Json.NET serialisieren

Da Json.NET derzeit keine integrierte Methode zum Serialisieren einer Sammlung in NDJSON hat, wäre die einfachste Antwort, in einen einzelnen TextWriter zu schreiben mit einem separaten JsonTextWriter für jede Zeile, Einstellung CloseOutput = false für jeden:

public static partial class JsonExtensions
{
    public static void ToNewlineDelimitedJson<T>(Stream stream, IEnumerable<T> 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<T>(TextWriter textWriter, IEnumerable<T> 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);
            }
            // https://web.archive.org/web/20180513150745/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");
        }
    }
}

Beispielgeige.

Da die einzelnen NDJSON-Zeilen wahrscheinlich kurz sind, die Anzahl der Zeilen jedoch groß sein kann, schlägt diese Antwort eine Streaming-Lösung vor, um die Notwendigkeit zu vermeiden, eine einzelne Zeichenfolge mit mehr als 85 KB zuzuweisen. Wie in den Newtonsoft Json.NET-Leistungstipps erläutert , landen solche langen Zeichenfolgen auf dem Heap für große Objekte und können anschließend die Anwendungsleistung beeinträchtigen.