首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用Akka Stream流式传输巨大的json

使用Akka Stream流式传输巨大的json
EN

Stack Overflow用户
提问于 2017-06-10 23:51:57
回答 3查看 2K关注 0票数 2

我有一个问题,一个json平板的巨大的http响应,其中只有一部分是兴趣点。我无法更改响应结构。下面是一个例子

代码语言:javascript
运行
复制
{
  "searchString": "search",
  "redirectUrl": "",
  "0": {
    "numRecords": 123,
    "refinementViewModelCollector": {},
//    Lots of data here
    "results": [
      {
        "productCode": "123",
        "productShortDescription": "Desc",
        "brand": "Brand",
        "productReview": {
          "reviewScore": 0
        },
        "priceView": {
          "salePriceDisplayable": false,
        },
        "productImageUrl": "url",
        "alternateImageUrls": [
          "url1"
        ],
        "largeProductImageUrl": "url4",
        "videoUrl": ""
      },
      {
        "productCode": "124",
        "productShortDescription": "Desc",
        "brand": "Brand",
        "productReview": {
          "reviewScore": 0
         },
        "priceView": {
          "salePriceDisplayable": false,
        },
        "preOrder": false,
        "productImageUrl": "url",
        "alternateImageUrls": [
          "url1"
        ],
        "largeProductImageUrl": "url4",
        "videoUrl": ""
      }
    ]
    //lots of data here
  }
}

我感兴趣的是results Jason Array中的条目,但它们位于json的中间

我创建了一个小型的Play WS客户端,如下所示:

代码语言:javascript
运行
复制
val wsClient: WSClient = ???
val ret = wsClient.url("url").stream()
ret.flatMap { response =>
  response.body.via(JsonFraming.objectScanner(1024))
    .map(_.utf8String)
    .runWith(Sink.foreach(println))
}

这是行不通的,因为它会把整个json平板作为Json对象。我需要跳过一些数据,直到"results":条目出现在流中,然后开始解析条目并跳过所有其他数据。你知道该怎么做吗?

EN

回答 3

Stack Overflow用户

发布于 2020-05-31 20:42:53

查看Alpakka's JSON module,它可以流式传输嵌套JSON结构的特定部分:

代码语言:javascript
运行
复制
response
  .body
  .via(JsonReader.select("$.0.results[*]"))
  .map(_.utf8String)
  .runWith(Sink.foreach(println)) // or runForeach(println)
票数 3
EN

Stack Overflow用户

发布于 2017-06-11 01:39:12

有些解析器支持以流的形式进行解析。要获得一个很好的示例,请查看这个Circe示例https://github.com/circe/circe/tree/master/examples/sf-city-lots

票数 1
EN

Stack Overflow用户

发布于 2020-05-30 13:42:31

我希望对这个问题有一个更好的、特定于Scala的答案,但请查看Google的GSON库文档中的“混合阅读示例”:

https://sites.google.com/site/gson/streaming

Gson还支持混合流和对象模型访问。这让您的应用程序两全其美:对象模型访问的生产力和流的效率……这段代码读取一个包含消息数组的JSON文档。它以流的形式遍历数组元素,以避免将整个文档加载到内存中。它很简洁,因为它使用Gson的对象模型来解析各个消息。

这应该具有很好的内存性能(代码从Java读取,所以完整的结构永远不会在内存中),但是可能需要一些工作才能将结果放到Scala InputStream类中。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44475266

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档