我在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) 我有以下代码编写的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) 假设我有下一个案例类:
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?
我有以下案例类
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 抛出错误。
如何将空元素编码为空字符串(“”)?
我以前见过类似的问题,但没有一个有效。我认为他们会问一些不同的问题,所以我在这里问。我在一个文件中有这样的东西:
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) 我试图将以下字符串派生为适当的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) 我正在尝试编码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) 给定以下案例类:
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)
请注意,这是一个派生示例,仅用于演示我的问题。
这是一个简单的雀科服务器,使用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)."}
我该如何实现所需的编码器/解码器?
我有一份 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)