gpt4 book ai didi

scala - 如何将泛型类型传递给 Argonaut

转载 作者:行者123 更新时间:2023-12-01 08:06:11 24 4
gpt4 key购买 nike

我正在尝试包装 Argonaut ( http://argonaut.io ) 以便在 Scala 项目中序列化/反序列化 JSON。我们之前使用过 Jerkson,但由于它已停产,我们正在寻找替代方案。

这是基本的 JSON 包装器

import argonaut._, Argonaut._

object Json {
def Parse[T](input: String): T = {
input.decodeOption[T].get
}
}

当我尝试编译它时,我收到以下错误。
could not find implicit value for evidence parameter of type argonaut.DecodeJson[T]
input.decodeOption[T]
^
not enough arguments for method decodeOption: (implicit evidence$6: argonaut.DecodeJson[T]) Option[T].
Unspecified value parameter evidence$6.
input.decodeOption[T]
^

任何有关如何解决此问题的建议或有关我做错了什么的指示将不胜感激。

也非常欢迎关于替代 JSON 框架的建议。

我对 Scala/Java 以及泛型在那里的工作方式有点陌生,但我多年来一直在编写 .NET/C#。

最佳答案

为了使您的代码工作,您需要重新定义 Json像这样的对象:

object Json {
def Parse[T](input: String)(implicit decode:DecodeJson[T]): Option[T] = {
input.decodeOption[T]
}
}

你缺少的是隐含的 DecodeJson decodeOption的实例函数需要为了弄清楚如何解码。您还需要将返回类型定义为 Option[T]而不仅仅是 T .所有工作的完整示例如下所示:
import argonaut._, Argonaut._
case class User(id:Long, email:String, name:String)

object Json {
def Parse[T](input: String)(implicit decode:DecodeJson[T]): Option[T] = {
input.decodeOption[T]
}
}

object JsonTest{
implicit val userDecode = casecodec3(User.apply, User.unapply)("id", "email", "name")

def main(args: Array[String]) {
val json = """{
"id": 1,
"email": "foo@test.com",
"name": "foo bar"
}"""

val userOpt = Json.Parse[User](json)
println(userOpt)
}
}

至于其他 Json 框架,您可以查看:

Play Json

json4s

spray-json

Jackson Scala Module

关于scala - 如何将泛型类型传递给 Argonaut,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17042763/

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