在 Argonaut 中解析子文档
Parsing subdocuments in Argonaut
我正在尝试使用 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(帖子, .field("took").flatMap(.string).getOrElse("42"), msg => msg ) 可以很好地获取 "took" 字段。
现在,我想不出一种方法来访问嵌套值,例如 hits->total。
另一个问题是如何按索引访问列表元素,例如 hits -> hits -> element 0 -> _index 以获取 logstash-2017.03.15 在我的例子中。
要从嵌套对象中获取信息,您必须深入了解正在传递的函数(函数方式)。
我的意思是 .map(.getField().map(.getField().map)) - 你在那个领域越来越深入。
您还会注意到 toInt 类型 return 一个选项因此我们使用的是 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 的普通列表,您可以在
上使用 .field()
我正在尝试使用 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(帖子, .field("took").flatMap(.string).getOrElse("42"), msg => msg ) 可以很好地获取 "took" 字段。
现在,我想不出一种方法来访问嵌套值,例如 hits->total。 另一个问题是如何按索引访问列表元素,例如 hits -> hits -> element 0 -> _index 以获取 logstash-2017.03.15 在我的例子中。
要从嵌套对象中获取信息,您必须深入了解正在传递的函数(函数方式)。 我的意思是 .map(.getField().map(.getField().map)) - 你在那个领域越来越深入。
您还会注意到 toInt 类型 return 一个选项因此我们使用的是 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 的普通列表,您可以在
.field()