gpt4 book ai didi

c# - 使用 Json.NET 序列化为 NDJSON

转载 作者:太空狗 更新时间:2023-10-29 20:15:49 26 4
gpt4 key购买 nike

是否可以序列化为NDJSON (换行符分隔的 JSON)使用 Json.NET? Elasticsearch API 使用 NDJSON 进行批量操作,我找不到任何迹象表明任何 .NET 库都支持这种格式。

This answer提供了反序列化 NDJSON 的指南,有人指出可以独立序列化每一行并加入换行符,但我不一定会称其为支持

最佳答案

由于 Json.NET 目前没有将集合序列化为 NDJSON 的内置方法,最简单的答案是使用单独的 JsonTextWriter 写入单个 TextWriter对于每一行,设置 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);
}
// 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");
}
}
}

样本 fiddle .

由于单个 NDJSON 行可能很短,但行数可能很大,因此该答案建议使用流式解决方案来避免分配大于 85kb 的单个字符串的必要性。如 Newtonsoft Json.NET Performance Tips 中所述, 如此大的字符串最终出现在 large object heap 上并且随后可能会降低应用程序性能。

关于c# - 使用 Json.NET 序列化为 NDJSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44787652/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com