Разбор Json с помощью Circe и монокля

Я написал этот пример кода

package com.abhi
import io.circe._
import io.circe.optics.JsonPath._

object CirceTest extends App {
   val id = root.id.long
   val date = root.date.long

   val input =
      """
        |{
        |  "id" : 0,
        |  "childIds" : [
        |    11, 12, 13
        |  ],
        |  "date" : 1480815583505
        |}
      """.stripMargin
   parser.parse(input) match {
      case Left(a) => println(s"failed ${a}")
      case Right(json) =>
         val myId = id.getOption(json).get
         val myDate = date.getOption(json).get
         println(s"id: ${myId} date: ${myDate}")
   }
}

но это событие не скомпилируется

CirceTest.scala:26: constructor cannot be instantiated to expected type;
[error]  found   : scala.util.Right[A,B]
[error]  required: cats.data.Xor[io.circe.ParsingFailure,io.circe.Json]
[error]       case Right(json) =>
[error]            ^

я тоже пробовал

val jsonEither = parser.parse(input)
if (jsonEither.isRight) {
   val json = jsonEither.right.get
   val myId = id.getOption(json).get
   val myDate = date.getOption(json).get
   println(s"id: ${myId} date: ${myDate}")
}

но это тоже не получается

[error] CirceTest.scala:27: value right is not a member of cats.data.Xor[io.circe.ParsingFailure,io.circe.Json]
[error]       val json = jsonEither.right.get
[error]                             ^
[error] one error found

Я очень удивлен. когда я могу сделать isRight, то почему компилятор говорит, что я не могу сделать right?

Вот мой файл build.sbt

name := "CirceTest"

version := "1.0"

scalaVersion := "2.11.8"

libraryDependencies ++= Seq(
   "io.circe" %% "circe-core" % "0.5.1",
   "io.circe" %% "circe-generic" % "0.5.1",
   "io.circe" %% "circe-parser" % "0.5.1",
   "io.circe" %% "circe-optics" % "0.5.1"
)

person Knows Not Much    schedule 04.12.2016    source источник


Ответы (1)


Circe зависит от библиотеки Cats, которая недавно удалила cats.data.Xor, который был правым типом, похожим на Either. . Circe 0.5.0 и более ранние версии использовали cats.data.Xor в качестве типа результата для синтаксического анализа и декодирования, но 0.6.0+ использует стандартную библиотеку Either, поскольку Xor больше нет.

Обновление вашей circe-зависимости до версии 0.6.1 заставит ваш код работать так, как написано. Если по какой-то причине вы застряли на более ранней версии circe, вам нужно настроить свой код для работы с Xor. Однако я бы посоветовал придерживаться самой последней версии — и circe, и Cats — молодые проекты, и дела развиваются быстро. Если вы застряли на более ранней версии из-за библиотеки, которая зависит от circe, свяжитесь с Gitter. и мы постараемся работать с сопровождающими библиотеки, чтобы обновлять информацию.

person Travis Brown    schedule 04.12.2016