最も単純な答えは、それぞれについてCloseOutput = false
設定、ライン毎に別個JsonTextWriter
を使用して単一TextWriter
に書き込むであろう:
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);
}
// 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");
}
}
}
サンプルfiddle。
個々のNDJSONラインは短いかもしれないが、ラインの数が多い可能性があるので、この回答は、85kbより大きな単一のストリングを割り当てる必要性を回避するストリーミング解決策を示唆している。 Newtonsoft Json.NET Performance Tipsで説明したように、このような大きな文字列はlarge object heapになり、アプリケーションのパフォーマンスが低下する可能性があります。
出典
2017-06-27 19:19:01
dbc
このリンクはドメインを把握しています。 AWSやAzureのようなプロバイダは、数年にわたって改行文字で区切られたJSONを使用しています。 –