标签: circe

使用Circe将包含HList的案例类解析为JSON字符串

我在Scala做的事情.我有以下案例类:

import shapeless._
case class Foo(param1: String, param2: HList)
Run Code Online (Sandbox Code Playgroud)

我想使用Circe获得这种类型的JSON表示.我还想将生成的JSON字符串映射回类型.

模块circe-shapes自动推导出HLists,并且很容易从HList到JSON再返回.看这个例子:

scala> import shapeless._
import shapeless._

scala> import io.circe._, io.circe.generic.auto._, io.circe.parser._, io.circe.syntax._
import io.circe._
import io.circe.generic.auto._
import io.circe.parser._
import io.circe.syntax._

scala> import io.circe.shapes._
import io.circe.shapes._

scala> val myList = 30 :: "car" :: HNil
myList: shapeless.::[Int,shapeless.::[String,shapeless.HNil]] = 30 :: car :: HNil

scala> val listJson = myList.asJson
listJson: io.circe.Json =
[
  30,
  "car"
]

scala> listJson.as[HList] // won't work
<console>:32: error: could not …
Run Code Online (Sandbox Code Playgroud)

json scala hlist shapeless circe

3
推荐指数
1
解决办法
733
查看次数

迁移Json4S到Circe

我有以下代码编写的json4s编译和工作正常

import org.json4s._
def jsonRead[T <: AnyRef](input: String)(implicit m: Manifest[T]): T = {
    Try(read[T](input)).get
}

def jsonWrite[T <: AnyRef](input: T)(implicit m: Manifest[T]): String = {
    write[T](input).toString
}
Run Code Online (Sandbox Code Playgroud)

我写了以下Circe代码

import io.circe._
import io.circe.syntax._
import io.circe.generic.auto._
import io.circe.parser.decode
def unmarshall[T <: AnyRef](input: String)(implicit m: Manifest[T]) : T ={
    decode[T](input).right.get
}
def marshall[T <: AnyRef](input: T)(implicit m: Manifest[T]) : String = {
    input.asJson.toString
}
Run Code Online (Sandbox Code Playgroud)

但是我得到了错误

Error:(27, 16) could not find implicit value for parameter decoder: io.circe.Decoder[T] decode[T](json).right.get
Error:(27, 16) not enough arguments for …
Run Code Online (Sandbox Code Playgroud)

scala circe

3
推荐指数
1
解决办法
1136
查看次数

如何避免circe JSON序列化中的科学记数法

假设我有下一个案例类:

case class Person(id: String, money: BigDecimal)

object Person {
  implicit val encoder: Encoder[Person] = Encoder.forProduct2("ID", "Money")(u =>
    (u.id, u.money))
Run Code Online (Sandbox Code Playgroud)

我想将 Person 类的实例序列化为 JSON,所以当我评估asJsonfrom circe 时,我得到科学记数法的结果:

{
    "ID" : "123",
    "VALOR_SAP" : 2.7E+7
}
Run Code Online (Sandbox Code Playgroud)

为什么会发生这种情况?我想原因是因为默认为字符串的BigDecimal自动格式化为科学记数法。

我能做些什么来避免这种情况?可创建从扩展另一个类型BigDecimal和重写toString

json scala bigdecimal circe

3
推荐指数
1
解决办法
940
查看次数

如何在Circe中将null解码为空字符串

我有以下案例类

case class Response(attributes: CsvAttributes, rows: Seq[Array[String]])
Run Code Online (Sandbox Code Playgroud)

rows是从可以具有阵列中的空元素如下所示一个Java库获得:

[
  ["a", "b", null],
  ["c", null, "d"]
]
Run Code Online (Sandbox Code Playgroud)

Response(attributes, rows).asJson.noSpaces 抛出错误。

如何将空元素编码为空字符串(“”)?

scala circe

3
推荐指数
1
解决办法
3413
查看次数

Circe 解码为由多个案例类扩展的密封特征

我以前见过类似的问题,但没有一个有效。我认为他们会问一些不同的问题,所以我在这里问。我在一个文件中有这样的东西:

sealed trait Thing
case class SomeThing() extends Thing
case class OtherThing() extends Thing
Run Code Online (Sandbox Code Playgroud)

并在另一个文件中:

val str = //valid json
val decoded = decode[Thing](str)
println(decoded)
Run Code Online (Sandbox Code Playgroud)

我得到:

Left(DecodingFailure(...))
Run Code Online (Sandbox Code Playgroud)

如果我这样做,这会起作用:

val str = //valid json
val decoded = decode[SomeThing](str)
println(decoded)
Run Code Online (Sandbox Code Playgroud)

scala circe

3
推荐指数
2
解决办法
4378
查看次数

为什么不将其解码为ADT类型?

我试图将以下字符串派生为适当的ADT类型:

res6: String = {"raw":"Hello","status":{"MsgSuccess":{}}} 
Run Code Online (Sandbox Code Playgroud)

并使用circe库。

ADT类型如下所示:

sealed trait MsgDoc {
}

final case class MsgPreFailure(raw: String, reasons: Chain[String]) extends MsgDoc

final case class MsgProceed(raw: String, status: MsgStatus) extends MsgDoc
Run Code Online (Sandbox Code Playgroud)

MsgStatus类型:

sealed trait MsgStatus {

}

case object MsgSuccess extends MsgStatus

final case class MsgFailure(reasons: Chain[String]) extends MsgStatus

final case class MsgUnknown(reason: String) extends MsgStatus
Run Code Online (Sandbox Code Playgroud)

和方式,我试着开车:

object MsgDocDerivation {

  import shapeless.{Coproduct, Generic}

  implicit def encodeAdtNoDiscr[A, Repr <: Coproduct](implicit
                                                      gen: Generic.Aux[A, Repr],
                                                      encodeRepr: Encoder[Repr]
                                                     ): Encoder[A] = …
Run Code Online (Sandbox Code Playgroud)

scala circe

3
推荐指数
1
解决办法
79
查看次数

斯卡拉 Circe。编码器类型 任意

我正在尝试编码class ResponseResult为 json

case class ResponseResult (var Code : Int,
                 var Message: String,
                 var Data: Any )

var json = ResponseResult(1, "2", List(3,4,5)).asJson
Run Code Online (Sandbox Code Playgroud)

我收到错误找不到参数编码器的隐式值:io.circe.Encoder[ResponseResult]

然后我创建编码器

object ResponseResult {
    implicit val encodeResult: Encoder[ResponseResult] =
        Encoder.forProduct3[ResponseResult, Int, String, Any]("Code", "Message", "Data") {
            case ResponseResult(c, m, d) => (c, m, d.toString)
        }
}
Run Code Online (Sandbox Code Playgroud)

我收到错误找不到参数编码器的隐式值:编码器 [Any]

这是我的完整代码

import io.circe.Encoder
import io.circe.generic.auto._
import io.circe.syntax._

object a {
  case class ResponseResult (var Code : Int,
                             var Message: String,
                             var Data: Any ) …
Run Code Online (Sandbox Code Playgroud)

json scala circe

3
推荐指数
1
解决办法
210
查看次数

将嵌套对象编码为字符串

给定以下案例类:

case class Mailbox(value: String)
case class Group(objectType: String, mailbox: Mailbox)
Run Code Online (Sandbox Code Playgroud)

我试图找到一种编码 Group 对象的方法,如下所示,其中mailbox编码为字符串值,而不是对象:

{
  "objectType" : "Group",
  "mailbox" : "mailto:info@example.com"
}
Run Code Online (Sandbox Code Playgroud)

通过自动推导,编码/解码都成功了,但我最终得到了如下预期的结果:

{
  "objectType" : "Group",
  "mailbox" : {
    "value" : "mailto:info@example.com"
  }
}
Run Code Online (Sandbox Code Playgroud)

我可以通过添加如下所示的自定义编码器来实现我想要的结果:

object Mailbox {
  implicit val encoder: Encoder[Mailbox] = (m: Mailbox) => Json.fromString(m.value)
  implicit val decoder: Decoder[Mailbox] = deriveDecoder[Mailbox]
}
Run Code Online (Sandbox Code Playgroud)

但是,解码失败并显示以下内容:

DecodingFailure(Attempt to decode value on failed cursor, List(DownField(value), DownField(mailbox)))
Run Code Online (Sandbox Code Playgroud)

我试图通过为邮箱编写自定义解码器来解决这个问题,但得到了相同的结果。任何有关处理这种情况的正确方法的指导将不胜感激。

这是完整的代码:

DecodingFailure(Attempt to decode value on failed cursor, List(DownField(value), DownField(mailbox)))
Run Code Online (Sandbox Code Playgroud)

请注意,这是一个派生示例,仅用于演示我的问题。

json scala circe

3
推荐指数
1
解决办法
478
查看次数

Circe解码器为scalaz.Maybe

这是一个简单的雀科服务器,使用circe作为解码器:

import com.twitter.finagle.http.RequestBuilder
import com.twitter.io.Buf
import io.circe.generic.auto._
import io.finch._
import io.finch.circe._

case class Test(myValue: Int)

val api = post("foo" :: body.as[Test]) { test: Test => Ok(test) }

val bodyPost = RequestBuilder()
  .url("http://localhost:8080/foo")
  .buildPost(Buf.Utf8("""{ "myValue" : 42 }"""))

api.toService.apply(bodyPost).onSuccess { response =>
  println(s"$response: ${response.contentString}")
}

// output: Response("HTTP/1.1 Status(200)"): {"myValue":42}
Run Code Online (Sandbox Code Playgroud)

将内容myValue改为Option开箱即用,给出与上述代码相同的结果.但是,将其更改为scalaz.Maybe:

import scalaz.Maybe
case class Test(myValue: Maybe[Int])
Run Code Online (Sandbox Code Playgroud)

结果是:

响应("HTTP/1.1状态(400)"):{"message":"正文无法转换为测试:CNil:El(DownField(myValue),true,false)."}

我该如何实现所需的编码器/解码器?

scala scalaz finch circe

2
推荐指数
1
解决办法
678
查看次数

当字段不完整时,用 Circe 解码 Json

我有一份 json 格式的成绩单,里面有一堆单词

{
     "words": [{
          "duration": 123,
          "name": "world"
          "time": 234,
          "speaker": null
      }]
}
Run Code Online (Sandbox Code Playgroud)

我一直在使用 Circe 来编码/解码 Json。在这种特殊情况下:

import io.circe.generic.auto._
import io.circe.parser._

val decoded = decode[Transcript](transcriptJson)
Run Code Online (Sandbox Code Playgroud)

我的 ADT 看起来像:

case class Word(
  duration: Double,
  name: String,
  time: Float,
  para: String,
  speaker: Option[String],
  key: Option[String] = None,
  strike: Option[String] = None,
  highlight: Option[String] = None
)

case class Transcript(words: List[Word])
Run Code Online (Sandbox Code Playgroud)

有时单词有像“strike”或“highlight”这样的键,但很可能没有。如果没有,我会收到以下错误消息。

Left(DecodingFailure([A]List[A], List(DownField(highlight), MoveRight, MoveRight, MoveRight, MoveRight, MoveRight, MoveRight, MoveRight, MoveRight, MoveRight, MoveRight, MoveRight, MoveRight, MoveRight, MoveRight, MoveRight, MoveRight, …
Run Code Online (Sandbox Code Playgroud)

scala argonaut circe

2
推荐指数
1
解决办法
1747
查看次数

标签 统计

circe ×10

scala ×10

json ×4

argonaut ×1

bigdecimal ×1

finch ×1

hlist ×1

scalaz ×1

shapeless ×1