gpt4 book ai didi

即使 Json.toString 返回正确的值,Json.asString 也返回 None

转载 作者:行者123 更新时间:2023-12-02 06:04:04 25 4
gpt4 key购买 nike

给定以下案例类LogMessage:

import io.circe.{Decoder, Encoder}
import io.circe.generic.semiauto.{deriveDecoder, deriveEncoder}
import enumeratum.{CirceEnum, Enum, EnumEntry}
import io.circe.syntax._

sealed trait LogLevel extends EnumEntry

object LogLevel extends Enum[LogLevel] with CirceEnum[LogLevel] {
val values = findValues

case object Warning extends LogLevel
case object Error extends LogLevel
case object Info extends LogLevel
case object Success extends LogLevel
}

object LogMessage {
implicit val logMessageDecoder: Decoder[LogMessage] = deriveDecoder[LogMessage]
implicit val logMessageEncoder: Encoder[LogMessage] = deriveEncoder[LogMessage]
}

case class LogMessage(level: LogLevel, text: String, args: List[String], date: Long)
case class MyClass[A](obj: A)(implicit encoder: Encoder[A]) {
def message1: String = obj.asJson.toString
def message2: Option[String] = obj.asJson.asString
}

为什么这有效:

val x = MyClass(LogMessage(LogLevel.Info, "test notification", Nil, 1550218866571))

x.message1 // {\n "level" : "Info",\n "text" : "test notification",\n "args" : [\n ],\n "date" : 1550218866571\n}

但这并不:

x.message2 // None

以下是解决此问题的 Scastie 链接:link .

最佳答案

其中,Json 有六个 asX 方法,对应于 JSON 中的六种数据类型。例如,如果 Json 实例 x 表示 JSON bool 值,则 x.asBoolean 将返回包含以下内容的 Some值为 Boolean,但如果 x 是 JSON 字符串、数组、对象、数字或 null,则 x.asBoolean 将为空。

在这种情况下,您会看到 .asString 返回 None,因为您在表示 JSON 对象的 Json 值上调用它,不是 JSON 字符串。

Json 上的 toString 方法完全不同:它是通用的 Scala/Java toString,在 Json 的情况下 被实现为.spaces2。我不确定您在这里要做什么,但一般来说,如果您想序列化 io.circe.Json 值,我建议避免使用 toString 值,最好使用打印机或使格式选项更明确的打印方法(例如 noSpacesspaces2 等)。

(就其值(value)而言,我对 Json 上的 asStringasNull 等方法的命名并不完全满意。一般来说,“as”用于编码或解码的方法名称中,这并不完全是这些情况下发生的情况,但它足够接近,我从来没有费心想出更好的替代方案。)

关于即使 Json.toString 返回正确的值,Json.asString 也返回 None,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54705346/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com