是否可以序列化到NDJSON (换行符分隔JSON)使用Json.NET? 该Elasticsearch API使用NDJSON批量操作,我可以找到什么暗示,这种格式是由任何 .NET库支持。
这个答案提供指导反序列化NDJSON,并有人指出,一个能够独立序列每一行和新行加入,但我不一定会调用的支持 。
是否可以序列化到NDJSON (换行符分隔JSON)使用Json.NET? 该Elasticsearch API使用NDJSON批量操作,我可以找到什么暗示,这种格式是由任何 .NET库支持。
这个答案提供指导反序列化NDJSON,并有人指出,一个能够独立序列每一行和新行加入,但我不一定会调用的支持 。
最简单的回答将是写入到单一TextWriter
使用单独JsonTextWriter
对每一行,设定CloseOutput = false
每个:
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");
}
}
}
样品小提琴 。
由于个别NDJSON线很可能是短,但线路的数量可能很大,这样的回答提出了一种流媒体解决方案,以避免分配一个字符串超过85KB更大的必要性。 正如上文Newtonsoft Json.NET性能提示 ,这样大的字符串结束了对大对象堆随后可以降低应用程序的性能。
你可以试试这个:
string ndJson = JsonConvert.SerializeObject(value, Formatting.Indented);
但现在我明白,你是不是只是想美化打印序列化对象。 如果您序列化对象是一些集合类或枚举的,你能不能只是做自己通过序列的每个元素?
StringBuilder sb = new StringBuilder();
foreach (var element in collection)
{
sb.AppendLine(JsonConvert.SerializeObject(element, Formatting.None));
}
// use the NDJSON output
Console.WriteLine(sb.ToString());