gpt4 book ai didi

c# - 使用 Json.net 将大量数据流式传输为 JSON 格式

转载 作者:太空狗 更新时间:2023-10-29 18:14:53 35 4
gpt4 key购买 nike

使用 MVC 模型,我想编写一个 JsonResult,它将 Json 字符串流式传输到客户端,而不是一次将所有数据转换为 Json 字符串,然后再将其流式传输回客户端。我有一些操作需要在 Json 传输时发送非常大的记录(超过 300,000 条记录),我认为基本的 JsonResult 实现不可扩展。

我正在使用 Json.net,我想知道是否有一种方法可以在转换 Json 字符串时流式传输其 block 。

//Current implementation:
response.Write(Newtonsoft.Json.JsonConvert.SerializeObject(Data, formatting));
response.End();

//I know I can use the JsonSerializer instead
Newtonsoft.Json.JsonSerializer serializer = new Newtonsoft.Json.JsonSerializer();
serializer.Serialize(textWriter, Data);

但是我不确定如何将 block 写入 textWriter 并写入响应并调用 reponse.Flush() 直到所有 300,000 条记录都转换为 Json。

这可能吗?

最佳答案

假设您的最终输出是一个 JSON 数组,并且每个“ block ”都是该数组中的一项,您可以尝试类似以下 JsonStreamingResult 类的内容。它使用 JsonTextWriter 将 JSON 写入输出流,并使用 JObject 作为在将每个项目写入编写器之前分别对其进行序列化的方法。您可以向 JsonStreamingResult 传递一个 IEnumerable 实现,它可以从您的数据源中单独读取项目,这样您就不会一次将它们全部存储在内存中。我尚未对此进行广泛测试,但它应该能让您朝着正确的方向前进。

public class JsonStreamingResult : ActionResult
{
private IEnumerable itemsToSerialize;

public JsonStreamingResult(IEnumerable itemsToSerialize)
{
this.itemsToSerialize = itemsToSerialize;
}

public override void ExecuteResult(ControllerContext context)
{
var response = context.HttpContext.Response;
response.ContentType = "application/json";
response.ContentEncoding = Encoding.UTF8;

JsonSerializer serializer = new JsonSerializer();

using (StreamWriter sw = new StreamWriter(response.OutputStream))
using (JsonTextWriter writer = new JsonTextWriter(sw))
{
writer.WriteStartArray();
foreach (object item in itemsToSerialize)
{
JObject obj = JObject.FromObject(item, serializer);
obj.WriteTo(writer);
writer.Flush();
}
writer.WriteEndArray();
}
}
}

关于c# - 使用 Json.net 将大量数据流式传输为 JSON 格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26269438/

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