标签: circe

使用Circe解码普通类(不是案例类)

我已经编写了这段代码来使用circe来读写josn

import io.circe._, io.circe.generic.auto._, io.circe.parser._, io.circe.syntax._
case class Foo(i: Int)
val f = Foo(10)
val json = f.asJson.toString
val t1 = decode[Foo](json)
Run Code Online (Sandbox Code Playgroud)

这非常有效.但是,如果我创建一个普通的类Bar

class Bar { var i : Int = 0 }
decode[Bar](json)
Run Code Online (Sandbox Code Playgroud)

现在我收到错误

 could not find implicit value for evidence parameter of type io.circe.Decoder[$sess.cmd25.Bar]
Run Code Online (Sandbox Code Playgroud)

那么有可能使用普通类并使用Circe从json解码它们吗?

scala circe

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

使用 Circe 将 JSON 数组解析为 case 类

让我们使用这个示例 JSON:

{
  "bids": [
    [16182.06, 0.02994158],
    [16179.56, 0.01902097],
    [16178.05, 0.06538498]
  ],
  "asks": [
    [16191.92, 0.03597287],
    [16193.33, 0.0839688],
    [16194.95, 0.0857127]
  ]
}
Run Code Online (Sandbox Code Playgroud)

没什么特别的,事实上,这可以简单地解析为一个案例类:

@JsonCodec case class OrderBook(bids: Seq[Seq[Double]], asks: Seq[Seq[Double]])
Run Code Online (Sandbox Code Playgroud)

这很好用...


问题

我实际上知道每个数组的大小都是 2,并且

  • 第一个元素 - >它是“率”
  • 第二个元素 -> 它是“金额”

我想解决这个问题Circe并将其解析为类结构,例如:

@JsonCodec case class OrderBook(bids: Seq[Elems], asks: Seq[Elems])

case class Elems(rate: Double, amount: Double)
Run Code Online (Sandbox Code Playgroud)

我曾尝试编写我的编码器和解码器:

object Elems {
  implicit val encodeElems: Encoder[Elems] = (a: Elems) =>
    Json.arr(
      Json.fromDoubleOrNull(a.rate), Json.fromDoubleOrNull(a.amount)
    )

  implicit val decodeElems: Decoder[Elems] = (c: HCursor) => …
Run Code Online (Sandbox Code Playgroud)

json scala circe

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

是否可以让半自动解码器考虑案例类字段的默认值?

是否可以让半自动解码器考虑案例类字段的默认值?

以下代码将失败:

Left(DecodingFailure(Attempt to decode value on failed cursor, List(DownField(isActive))))

我认为 circe 会考虑 case class 字段的默认值 isActive

case class Person(
  id: Option[Int] = None,
  name: String,
  isActive: Boolean = true
)

implicit val personJsonDecoder: Decoder[Person] = deriveDecoder

val rawJson = """
{
  "name": "Geovanny Junio"
}
"""

val r = for {
  j <- parse(rawJson)
  p <- j.as[Person]
} yield p

println(r)
Run Code Online (Sandbox Code Playgroud)

json scala circe generic-derivation

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

使用 circe 在类主体中使用“require”解码案例类会引发异常,而不是返回“Left”

我有一个案例类,其中一些逻辑约束require在案例类主体中作为 s 实现。当尝试从表示语法正确但逻辑上无效的实例的 JSON 中解码此案例类时,异常实际上是在调用线程上引发的,而不是作为Leftfrom的返回decode

重现代码片段:

case class Foo(bar: String) {
  require(bar.length < 5)
}

object Sandbox extends App {
  import io.circe.generic.auto._
  import io.circe.parser._

  val foo1 = decode[Foo](""" {"bar":"abc"} """)
  println(s"foo1: $foo1")

  //expected: Left(IllegalArgumentException("requirement failed"))
  //actual: throws IllegalArgumentException("requirement failed")
  val foo2 = decode[Foo](""" {"bar":"abcdefg"} """) 
  println(s"foo2: $foo2")
}
Run Code Online (Sandbox Code Playgroud)

是否可以让此异常返回而不Left抛出decode?欢迎任何想法/建议...

TIA

M。

json scala circe

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

Scala、Circe、Json - 如何从 json 中删除父节点?

我有一个像这样的json结构:

"data" : {
  "fields": {
    "field1": "value1",
    "field2": "value2"
  }
}
Run Code Online (Sandbox Code Playgroud)

现在我想删除fields节点并将数据保留在data

"data" : {
   "field1": "value1",
   "field2": "value2"
 }
Run Code Online (Sandbox Code Playgroud)

我试着这样做:

val result = data.hcursor.downField("fields").as[JsonObject].toOption.head.toString
Run Code Online (Sandbox Code Playgroud)

但我得到了一个奇怪的结果,而不仅仅是字符串格式的 json

我也试过:

val result = data.hcursor.downField("fields").top.head.toString
Run Code Online (Sandbox Code Playgroud)

但它是一样的:

val result = data.toString
Run Code Online (Sandbox Code Playgroud)

它包括fields.

我应该如何更改我的代码以删除fieldsroot 并将数据保留在data属性下?

json scala scala-cats circe

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

如何使用 Circe 解码包含 json 的数组

我的 circe 解码器如下所示。我确信我的情感解码器可以正常工作,因此下面不会包含它。

case class CryptoData(value: String, valueClassification: Sentiment)
Run Code Online (Sandbox Code Playgroud)
  implicit val decoder: Decoder[CryptoData] = Decoder.instance { json =>
    for {
      value               <- json.downField("data").get[String]("value")
      valueClassification <- json.downField("data").get[Sentiment]("value_classification")
    } yield CryptoData(value, valueClassification)
  }
Run Code Online (Sandbox Code Playgroud)

我的 Json 看起来像这样

{
  "name" : "Fear and Greed Index",
  "data" : [
    {
      "value" : "31",
      "value_classification" : "Fear",
      "timestamp" : "1631318400",
      "time_until_update" : "54330"
    }
  ],
  "metadata" : {
    "error" : null
  }
}
Run Code Online (Sandbox Code Playgroud)

我只是想要valuevalue_classification。可以看出,这些值位于一个数组中。

我怀疑 Circe 正在寻找解码 aList[data]但我不想创建 acase …

json scala circe http4s-circe circe-optics

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

需要帮助使用 Circe 解码以下 json

我正在尝试使用 Circe 库解析嵌套的 JSON 对象。我想将它映射到忽略某些字段的平面案例类。

import io.circe.generic.auto._
import io.circe.{Decoder, Encoder, HCursor, Json}

val jsonString = """{
  "parent" : {
    "name" : "title",
    "items" : [
      {
        "foo" : "",
        "attrs" : {
          "attrA" : "",
          "attrB" : ""
        }
      },
      {
        "foo" : "",
        "attrs" : {
          "attrA" : "",
          "attrB" : "",
          "attrC" : ""
        }
      }]
    }
}"""


// Notice I don't care about "attrC"
case class Item(foo: String, attrA: String, attrB: String)
case class Parent(name: String, items: …
Run Code Online (Sandbox Code Playgroud)

scala circe http4s-circe

0
推荐指数
1
解决办法
2831
查看次数

如何使用circe(从案例类到其字符串表示形式)“展平”对象的JSON表示形式?

我有一个Date内部使用的自定义类:

case class Date(month: Int, day: Int, year: Year)
Run Code Online (Sandbox Code Playgroud)

并这样使用:

case class Person(dateOfBirth: Date)
Run Code Online (Sandbox Code Playgroud)

但是,当我为我生成Json时,Person(Date(12, 20, 1990))会得到类似以下内容:

{
 "dateOfBirth": {
  "month": 12,
  "day": 20,
  "year": 1990
 }
}
Run Code Online (Sandbox Code Playgroud)

我想要得到的是这样的:

{ "dateOfBirth": "12-20-2990" } // or any custom format
Run Code Online (Sandbox Code Playgroud)

是否可以“平铺”自定义案例类,以便将它们仅当作值而不是被扩展?我已经尝试过类似的事情,它导致了StackOverflowError

  implicit val dateEncoder: Encoder[Date] = (date: Date) => {
    Json.fromString(s"${date.month}-${date.dayOfMonth}-${date.year}")
  }
Run Code Online (Sandbox Code Playgroud)

更新:此错误似乎与编码器无关-添加此编码器时恰好会触发该错误,但不会迫使我得出结论,这不是正确的编码方式。我已经接受了答案,因为它可以正确回答“提问”的问题。

这是在添加日期一之后“失败”的编码器:

  implicit val myEncoder: Encoder[Vector[MyCaseClass]] = (my: Vector[MyCaseClass]) => {
    if (my.nonEmpty) my.asJson else Json.Null
  }
Run Code Online (Sandbox Code Playgroud)

我可以将其编码为,Option[Vector[MyCaseClass]]但是我正在尝试直接对Vector进行编码,以了解会发生什么...

scala circe

0
推荐指数
1
解决办法
140
查看次数

如何为抽象类编写circe解码器/编码器

我需要编写解码器/编码器 akka.http.scaladsl.model.HttpHeader

abstract class HttpHeader extends jm.HttpHeader with ToStringRenderable {
  def name: String
  def value: String
  def lowercaseName: String
  def is(nameInLowerCase: String): Boolean = lowercaseName == nameInLowerCase
  def isNot(nameInLowerCase: String): Boolean = lowercaseName != nameInLowerCase
}
Run Code Online (Sandbox Code Playgroud)

我试过使用派生编码和解码,但没有用

implicit val jsonDecoder: Decoder[HttpHeader] = deriveDecoder[HttpHeader]
implicit val jsonEncoder: Encoder[HttpHeader] = deriveEncoder[HttpHeader]
Run Code Online (Sandbox Code Playgroud)

刚刚收到一个错误 could not find Lazy implicit value of type io.circe.generic.decoding.DerivedDecoder[akka.http.scaladsl.model.HttpHeader]

scala circe

0
推荐指数
1
解决办法
504
查看次数

使用 Circe 检查 JSON 是否为空

是否circe提供任何函数来检查io.circe.Json对象是否为空?

Json文档没有报告任何相关内容,而JsonObject文档讨论了isEmpty函数,但我验证了这一点

 {}.asJson.asObject.isEmpty // false
Run Code Online (Sandbox Code Playgroud)

所以它没有像我预期的那样工作。

json scala circe

0
推荐指数
1
解决办法
821
查看次数