Sérialiser en tant que NDJSON à l’aide de Json.NET

Est-il possible de sérialiser sur NDJSON (JSON délimité par Newline) en utilisant Json.NET? L’API Elasticsearch utilise NDJSON pour les opérations en bloc et rien ne permet de penser que ce format est pris en charge par les bibliothèques .NET.

Cette réponse fournit des indications pour la désérialisation de NDJSON. Il a été noté que chaque ligne pouvait être sérialisée indépendamment et reliée à une nouvelle ligne, mais je n’appellerais pas nécessairement celle prise en charge .

La réponse la plus simple serait d’écrire dans un seul TextWriter utilisant un JsonTextWriter distinct pour chaque ligne, en définissant CloseOutput = false pour chaque:

 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"); } } } 

Échantillon de violon .

Étant donné que les lignes NDJSON individuelles sont susceptibles d’être courtes mais que le nombre de lignes peut être important, cette réponse suggère une solution de transmission en continu pour éviter la nécessité d’atsortingbuer une chaîne unique supérieure à 85 Ko. Comme expliqué dans Newtonsoft Json.NET Performance Tips , ces grandes chaînes se retrouvent sur le tas d’objects volumineux et peuvent par la suite dégrader les performances de l’application.

Vous pouvez essayer ceci:

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

mais maintenant je vois que vous ne voulez pas seulement que l’object sérialisé soit bien imprimé. Si l’object que vous sérialisez est une sorte de collection ou d’énumération, ne pouvez-vous pas le faire vous-même en sérialisant chaque élément?

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