当前位置: 首页 > 知识库问答 >
问题:

分析流非常大的JSON

谢昂雄
2023-03-14

这个问题类似于常规WebClient请求中的Spring反应式流数据,不同之处在于我没有立即从我的WebClient获得JSON数组,而是类似于这样:

这个JSON对象可能非常大(约100MB),因此需要处理并流到客户端,而不是解析。这是我似乎能够正确获得语义学的唯一方法:

{
   "result-set":{
      "docs":[
         {
            "id":"auhcsasb1005_100000"
         },
         {
            "id":"auhcsasb1005_1000000"
         },
         {
            "id":"auhcsasb1005_1000001"
         },
         {
            "id":"auhcsasb1005_1000002"
         },
         ...
         ...
         {
            "EOF":true
         }
      ]
   }
}
WebClient.create()
  .get()
  .retrieve()
  .bodyToMono(DontKnowWhatClass.class)
  .flatMapMany(resultSet -> Flux.fromIterable(resultSet.getDocs()))

但是这意味着我要在内存中反序列化100MB或更多,然后从中创建一个通量。我想知道的是:我是否错过了一些关键的东西?我能以某种方式从这样的对象中创建一个通量吗?可悲的是,我现在有办法影响结果集对象的呈现方式。

共有1个答案

关志勇
2023-03-14

您可以向控制器接受一个ServerWebExchange,该控制器有一个方法可以接受一个Publisherexchange。回答writeWith()

如果你有办法将有效载荷分解成块,你只需要创建一个通量来释放这些部分。

例如,如果您根本不关心有效负载,只想按原样发货:

    @GetMapping("/api/foo/{myId}")
    fun foo(exchange: ServerWebExchange, @PathVariable myId: Long): Mono<Void> {
        val content: Flux<DataBuffer> = webClient
            .get()
            .uri("/api/up-stream/bar/$myId")
            .exchange()
            .flatMapMany { it.bodyToFlux<DataBuffer>() }

        return exchange.response.writeWith(content)
    }

确保检查内容协商设置,以避免出现意想不到的缓冲。

 类似资料:
  • 我搜索了数据库和食谱,但似乎找不到正确的答案。我有一个非常简单的python代码,它总结了一个范围内的自我权力。我需要这个非常非常大的数字的最后十位,我已经尝试了get上下文(). prec,但是我仍然达到了极限。 代码如下: 我怎么能看到这些美丽的数字?它在我的四核上打印速度相对较快。这只是为了给ProjectEuler带来乐趣,问题#48,请不要破坏者。我不想要解决方案,也不想让工作为我完成,

  • 问题内容: 我试图找到一个非常简单,流畅,轻巧的javascript或jquery字幕。我已经尝试过丝绸选框之类的东西,但不适用于我正在使用的应用程序。因此,越短越好,越好-并且越容易调试。有人知道字幕易于实现的JavaScript替换吗? 码 问题答案: 希望这对您有所帮助,加油! html jQuery代码

  • 问题内容: 我想将包含字符串的巨大文件拆分为一组新的(较小)文件,并尝试使用nio2。 我不想将整个文件加载到内存中,因此我尝试了BufferedReader。 较小的文本文件应受文本行数的限制。 该解决方案有效,但是我想问一问,是否有人知道使用usion java 8(也许是带有stream()-api的lamdas)和nio2具有更好的性能的解决方案: 问题答案: 注意/ 及其子类的直接使用与

  • 前言 在 gRPC 的新版本(1.0.0-pre2)中,为了方便传递 debug 信息,在 StatusException 和 StatusRuntimeException 中增加了名为 Trailer 的 Metadata。 注: 在此之前,Status(和Status映射的StatusException)只有两个字段可以传递信息:1. status code 2. status decript

  • 我们的父工作流代码基本上是这样的(来自组织. 我们发现,在大多数情况下,父工作流工作者无法启动子工作流,并抛出上面的超时异常。它疯狂地重试,但从未成功,并一遍又一遍地打印超时异常。然而,有时我们非常幸运,它的工作。有时在活动工作器上它甚至更早就失败了,它抛出同样的异常。我们认为这是由于数据太大(大约5MB ),无法在超时时间内发送(从日志判断,我们猜测设置为2s)。如果我们用少量虚假数据调用< c

  • 我们有生成PDF文档的系统(使用Ecrion引擎)。我们正在使用时代字体。现在需要文档存档,因此我们正在从PDF切换到PDF/A,并将字体从Times 更改为Times New Roman(相同的字体)。这就是问题出现的地方 - 每个PDF / A也包括使用的字体(因为PDF / A是用于存档的PDF,因此它与字体一起出现)。问题是每个文档现在都包含“Times New Roman”,“Times