首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用Argonaut解析子文档

用Argonaut解析子文档
EN

Stack Overflow用户
提问于 2017-04-05 12:02:37
回答 1查看 122关注 0票数 0

我试图用Argonaut scala库解析Json:

代码语言:javascript
复制
{"took":5,"timed_out":false,"_shards":{"total":5,"successful":5,"failed":0},"hit
s":{"total":1285,"max_score":0.99627554,"hits":[{"_index":"logstash-2017.03.15",...

.field("took").flatMap(.string).getOrElse("42"),msg Parse.parseWith(Parse.parseWith,=> msg)可以很好地获得“接受”字段。

现在,我无法想出一种方法来访问嵌套的值,比如hits->total。另一个问题是如何按索引访问list元素,比如hits -> hits -> element 0 -> _index以获得logstash-2017.03.15。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-04-06 02:35:42

要从嵌套的对象中获取信息,您必须深入了解正在传递的函数(函数方式)。我的意思是.map(.getField().map(.getField().map)) --在这个领域中,您会越来越深入。

您还会注意到,toInt类型返回一个选项,因此我们使用的是一个flatMap

代码语言:javascript
复制
import argonaut._, Argonaut._

val posts: String = """{
                     |   "took":5,
                     |   "timed_out":false,
                     |   "_shards":{
                     |      "total":5,
                     |      "successful":5,
                     |      "failed":0
                     |   },
                     |   "hits":{
                     |      "total":1285,
                     |      "max_score":0.99627554,
                     |      "hits":[
                     |         {
                     |            "_index":"logstash-2017.03.15"
                     |         }
                     |      ]
                     |   }
                     |}""".stripMargin


val took = Parse.parseWith(posts, _.field("took").flatMap(_.number.flatMap(_.toInt)).getOrElse(0), msg => 0)

val hitsTotal = Parse.parseWith(posts, _.field("hits").flatMap(
                                          _.field("total").flatMap(_.number.flatMap(_.toInt))
                                       ).getOrElse(0), msg => 0)

val hitsList = Parse.parseWith[List[Json]](posts, _.field("hits").flatMap(_.field("hits").flatMap(_.array)).getOrElse(List()), msg => List())

结果:

代码语言:javascript
复制
took: Int = 5
hitsTotal: Int = 1285
hitsList: List[argonaut.Json] = List({"_index":"logstash-2017.03.15"})

您会注意到,hitsList只是一个普通的列表,包含了可以使用.field()的更多JSON

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

https://stackoverflow.com/questions/43230638

复制
相关文章

相似问题

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