当前位置: 首页 > 编程语言 > C#

使用Json.NET序列化为NDJSON分享

时间:2023-04-10 22:06:32 C#

使用Json.NET序列化为NDJSON是否可以使用Json.NET序列化为NDJSON(NewlineDelimitedJSON)?ElasticsearchAPI使用NDJSON进行批量操作,我没有发现任何.NET库支持这种格式的迹象。Thisanswer提供了反序列化NDJSON的指导,并指出可以使用换行符独立地序列化每一行,但我不一定支持它。最简单的答案是使用单独的JsonTextWriter为每行写入一个TextWriter为每行设置CloseOutput=false:publicstaticpartialclassJsonExtensions{publicstaticvoidToNewlineDelimitedJson(Streamstream,IEnumerableitems){//让调用者处理底层流使用(vartextWriter=newStreamWriter(stream,newUTF8Encoding(false,true),1024,true)){ToNewlineDelimitedJson(textWriter,items);}}publicstaticvoidToNewlineDelimitedJson(TextWritertextWriter,IEnumerableitems){varserializer=JsonSerializer.CreateDefault();foreach(variteminitems){//Formatting.None是默认值;为了清楚起见,我将其设置在这里。使用(varwriter=newJsonTextWriter(textWriter){Formatting=Formatting.None,CloseOutput=false}){serializer.Serialize(writer,item);}//http://specs.okfnlabs.org/ndjson///每个JSON文本必须符合[RFC7159]标准并且必须写入流后跟换行符n(0x0A)。//换行符MAY前面有一个回车符r(0x0D)。JSON文本不得包含换行符或回车符。textWriter.Write("n");}}}SampleFiddle由于单个NDJSON行可能很短但行数可能很大,因此此答案建议使用流解决方案来避免分配大于85kb的单个字符串。正如NewtonsoftJson.NET性能技巧中所解释的那样,如此大的字符串最终可能会出现在大型对象堆上,随后可能会降低应用程序性能。你可以试试这个:stringndJson=JsonConvert.SerializeObject(value,Formatting.Indented);但现在我看到你不只是想打印出序列化的对象。如果您正在序列化的对象是某种集合或枚举,您可以通过序列化每个元素来自己做到这一点吗?以上就是C#学习教程:使用Json.NET序列化NDJSON分享的所有内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注——StringBuildersb=newStringBuilder();foreach(集合中的var元素){sb.AppendLine(JsonConvert.SerializeObject(element,Formatting.None));}//使用NDJSON输出Console.WriteLine(sb.ToString());涉及侵权,请点击维权联系管理员删除。如需转载请注明出处: