【问题标题】:Parsing subdocuments in Argonaut在 Argonaut 中解析子文档
【发布时间】:2017-04-05 12:02:37
【问题描述】:

我正在尝试使用 Argonaut scala 库解析以下 Json:

{"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",...

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

现在,我想不出一种方法来访问像 hits->total 这样的嵌套值。 另一个问题是,我如何按索引访问列表元素,例如 hits -> hits -> element 0 -> _index 以在我的情况下获取 logstash-2017.03.15。

【问题讨论】:

    标签: scala parsing argonaut


    【解决方案1】:

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

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

    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())
    

    结果:

    took: Int = 5
    hitsTotal: Int = 1285
    hitsList: List[argonaut.Json] = List({"_index":"logstash-2017.03.15"})
    

    您会注意到hitsList 只是一个包含更多 JSON 的普通 List,您可以在上面使用 .field()

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多