【发布时间】:2017-11-12 12:04:24
【问题描述】:
我有一个 json 平板的巨大 http 响应问题,其中只有一部分是兴趣点。 我无法更改响应结构。 这是一个例子
{
"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 数组中的条目,但它们位于 json 中间
我像这样创建了一个小型 Play WS 客户端:
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": 条目出现在流中,然后开始解析条目并跳过所有其余部分。
任何想法如何做到这一点?
【问题讨论】:
-
使用jsoniter-scala FTW!它可以立即将您的字节数组
java.io.InputStream或java.nio.ByteBuffer解析为您的数据结构,从而非常有效地跳过不需要的 JSON 值。请检查 ExtractFields 基准测试的here 结果,以查看每个线程每秒可能超过 1GB 的吞吐量
标签: json scala playframework akka akka-stream