序列化为NDJSON使用Json.NET序列化为NDJSON使用Json.NET(Serialize

2019-05-12 06:29发布

是否可以序列化到NDJSON (换行符分隔JSON)使用Json.NET? 该Elasticsearch API使用NDJSON批量操作,我可以找到什么暗示,这种格式是由任何 .NET库支持。

这个答案提供指导反序列化NDJSON,并有人指出,一个能够独立序列每一行和新行加入,但我不一定会调用的支持

Answer 1:

最简单的回答将是写入到单一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性能提示 ,这样大的字符串结束了对大对象堆随后可以降低应用程序的性能。



Answer 2:

你可以试试这个:

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());


文章来源: Serialize as NDJSON using Json.NET