2

这是我第一次使用 argonauts,对镜头只有一点了解(足以应付)。我花了一段时间试图自己找出问题,但一无所获。

我正在尝试构建一个镜头以从一些 JSON 中获取一个 JsonArray(字符串)。我可以到达具有数组的对象,但不知道从那里做什么。

JSON 看起来像:

示例

到目前为止,我的镜头是这样的:

val hashtagsView = twitterEntitiesView >=> jsonObjectPL("hashtags") >=> jArrayPL

我也不确定这jArrayPL是否正确。我想做的只是从数组中检索文本。

所以总结一下,任何人都可以帮助我找出如何构建一个查看主题标签的镜头,然后为数组的每个元素查看文本,最后得到一个值作为JsonArray.

更新:

在 Travis 的帮助下,我编译了以下代码:

import argonaut._, Argonaut._
import monocle.std.list._, monocle.function.Each.each, monocle.function.Index.index
import scalaz._, Scalaz._

val \/-(json) = Parse.parse(rawJSON)
val lens = jObjectPrism
          .composeOptional(index("hashtags"))
          .composePrism(jArrayPrism)
          .composeTraversal(each[List[Json], Json])
          .composePrism(jObjectPrism)
          .composeOptional(index("text"))
          .composePrism(jStringPrism)

println(lens.getAll(json))

不幸的是,我得到一个运行时错误:scalaz.Scalaz$.ToEitherOps(Ljava/lang/Object;)Lscalaz/syntax/EitherOps;从行开始val \/-(json) = Parse.parse(rawJSON)

提前致谢!

4

2 回答 2

3

你愿意用 Argonaut 提供的Monocle镜头代替 Scalaz 镜头吗?如果是这样,使用遍历会更好:

import argonaut._, Argonaut._
import monocle.function.{ each, index }, monocle.std.list._
import scalaz._, Scalaz._

val doc = """{
  "hashtags": [
    { "indices": [0, 3], "text": "foo" },
    { "indices": [3, 6], "text": "bar" }
  ]
}"""

val \/-(json) = Parse.parse(doc)

val lens = jObjectPrism
  .composeOptional(index("hashtags"))
  .composePrism(jArrayPrism)
  .composeTraversal(each[List[Json], Json])
  .composePrism(jObjectPrism)
  .composeOptional(index("text"))
  .composePrism(jStringPrism)

进而:

scala> lens.getAll(json)
res0: List[argonaut.Argonaut.JsonString] = List(foo, bar)

scala> lens.modify(_ + " (new)")(json).spaces2
res1: String =
{
  "hashtags" : [
    {
      "indices" : [
        0,
        3
      ],
      "text" : "foo (new)"
    },
    {
      "indices" : [
        3,
        6
      ],
      "text" : "bar (new)"
    }
  ]
}

等等。你可以用 Scalaz 镜头做类似的事情,但这需要更多的工作。

于 2016-01-17T15:55:32.863 回答
0

好吧,如果您只想提取字段:

import argonaut._, Argonaut._
import scalaz._, Scalaz._

val doc = """{
  "hashtags": [
    { "indices": [0, 3], "text": "foo" },
    { "indices": [3, 6], "text": "bar" }
  ]
}"""

val \/-(json) = Parse.parse(doc)
val lense = jObjectPL
val hashtags = (lense >=> jsonObjectPL("hashtags") >=> jArrayPL).get(json)

hashtags.get.foreach(i => (lense >=> jsonObjectPL("indices") ).get(i).get.println )
hashtags.get.foreach(i => (lense >=> jsonObjectPL("text") ).get(i).get.println )

..或更好

val ind = ((v:Json) =>(lense >=> jsonObjectPL("indices") ).get(v).get)
val text = ((v:Json) =>(lense >=> jsonObjectPL("text") ).get(v).get)

hashtags.get.foreach(i => (ind(i), text(i)).println )
于 2016-11-22T15:49:20.030 回答