当前位置: 首页 > 面试题库 >

使用Json.net以JSON格式流式传输大量数据

吴胜涝
2023-03-14
问题内容

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

我正在使用Json.net,我想知道是否有一种方法可以在转换Json字符串时流化它的块。

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

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

这有可能吗?


问题答案:

假设您的最终输出是一个JSON数组,并且每个“块”都是该数组中的一项,则可以尝试以下JsonStreamingResult类。它使用a
JsonTextWriter将JSON写入输出流,并使用a
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();
        }
    }
}


 类似资料:
  • 问题内容: 我有一个200MB的文件,想通过下载提供给用户。但是,由于我们希望用户仅下载一次此文件,因此我们这样做: 强制下载。但是,这意味着整个文件必须加载到内存中,这通常不起作用。我们如何以每块kb的速度将文件流式传输给他们? 问题答案: 尝试这样的事情

  • 问题内容: 有多少个数据库系统使用JSON进行存储或传输?我知道: CouchDB MongoDB DBSlayer 我记得我在SO用户的个人资料中看到了另一个供应商。该系统使用的是所谓的二进制JSON,但我不记得该产品的名称。 最近,似乎越来越多的DB项目正在将JSON用于持久性存储。其中一些甚至将HTTP用作传输层。 问题答案: MongoDb是使用二进制JSON存储格式的一种。我不知道是否还

  • 问题内容: 我正在开发一个使用大型MySQL表的spring应用程序。加载大表时,我得到一个,因为驱动程序试图将整个表加载到应用程序内存中。 我尝试使用 但是然后我打开的每个ResultSet都挂了; 在网上查看时,我发现发生这种情况是因为它尝试在关闭ResultSet之前尝试加载所有未读的行,但事实并非如此,因为我这样做是: 小表(3行)也会发生挂起,如果我不关闭RecordSet(在一种方法中

  • 我想知道是否有可能实现2种方式的流式传输使用Spring WebFlow?基本上,我希望让客户端发送服务器接收到的数据通量将它们映射到String,然后返回结果,所有这些都流利地进行,而无需收集数据。我使用RSocket完成了它,但我想知道我是否可以使用超文本传输协议2.0(使用Spring和Project-Retor)获得相同的结果。 试过这样做: 1-客户: 2.服务器: 或者: 或者: 没有

  • 我按照Kantega/storm-twitter-workshop项目链接的步骤进行操作,但我在某一点上卡住了。在测试凭证时,通过运行文件夹中的主类作弊 cd作弊< br> mvn编译exec:Java-dexec . classpathscope = compile-dexec . main class = storm . starter . cheatingtwitterfuntopology

  • 问题内容: 经过几天的搜索SO和Google之后,我开始放弃了,所以我认为最好还是在这里发布。 我正在创建一个应该提供某种视频聊天功能的android应用。由于这应该尽可能接近实时,因此我阅读了各种协议,并决定尝试使用MJPEG作为入门工具(暂时不涉及音频)。 现在,流数据使我发疯。建立连接后,应用程序开始将摄像机预览帧写入流,但是VLC和mplayer均未开始播放视频。监视连接显示数据正在到达。