我已经编写了这段代码来使用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解码它们吗?
让我们使用这个示例 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) 是否可以让半自动解码器考虑案例类字段的默认值?
以下代码将失败:
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) 我有一个案例类,其中一些逻辑约束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结构:
"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属性下?
我的 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)
我只是想要value和value_classification。可以看出,这些值位于一个数组中。
我怀疑 Circe 正在寻找解码 aList[data]但我不想创建 acase …
我正在尝试使用 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) 我有一个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进行编码,以了解会发生什么...
我需要编写解码器/编码器 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]
是否circe提供任何函数来检查io.circe.Json对象是否为空?
Json文档没有报告任何相关内容,而JsonObject文档讨论了isEmpty函数,但我验证了这一点
{}.asJson.asObject.isEmpty // false
Run Code Online (Sandbox Code Playgroud)
所以它没有像我预期的那样工作。