首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Json.NET序列化为NDJSON

使用Json.NET序列化为NDJSON
EN

Stack Overflow用户
提问于 2017-06-27 18:43:50
回答 2查看 5.2K关注 0票数 8

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

这个答案为反序列化NDJSON提供了指导,并且注意到可以单独序列化每一行并使用换行符连接,但我不一定会称之为支持。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-06-27 19:19:01

由于Json.NET目前没有将集合序列化为NDJSON的内置方法,最简单的答案是为每一行使用单独的JsonTextWriter写入单个TextWriter,为每个行设置CloseOutput = false

代码语言:javascript
复制
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");
        }
    }
}

样品小提琴.

由于单个NDJSON行可能很短,但行数可能很大,这个答案提出了一个流解决方案,以避免分配大于85 be的单个字符串的必要性。正如在http://www.newtonsoft.com/json/help/html/Performance.htm#MemoryUsage中解释的那样,这样大的字符串最终出现在大对象堆上,随后可能会降低应用程序的性能。

票数 10
EN

Stack Overflow用户

发布于 2017-06-27 19:05:31

你可以试试这个:

代码语言:javascript
复制
string ndJson = JsonConvert.SerializeObject(value, Formatting.Indented);

但是现在我看到,您不只是希望序列化的对象被很好地打印出来。如果您正在序列化的对象是某种集合或枚举,那么您不能仅通过序列化每个元素来做到这一点吗?

代码语言:javascript
复制
StringBuilder sb = new StringBuilder();
foreach (var element in collection)
{
    sb.AppendLine(JsonConvert.SerializeObject(element, Formatting.None));
}

// use the NDJSON output
Console.WriteLine(sb.ToString());
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44787652

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档