gpt4 book ai didi

scala - json4s 序列化和反序列化泛型类型

转载 作者:行者123 更新时间:2023-12-04 16:42:38 24 4
gpt4 key购买 nike

因为我正在处理泛型类型,所以我不能使用特定的案例类。然后我创建了一个通用的 util 来序列化和反序列化通用对象。

import org.json4s
import org.json4s.Formats._
import org.json4s.native.JsonMethods._

object JsonHelper {
def json2Object[O](input: String) : O = {
parse(json4s.string2JsonInput(input)).asInstanceOf[O]
}
def object2Json[O](input: O) : String = {
write(input).toString
}
}

编译器抛出错误:

No JSON serializer found for type O. Try to implement an implicit Writer or JsonFormat for this type. write(input).toString



这应该在运行时抛出,但为什么在编译时抛出?

最佳答案

在上面的评论中,您问“那么 jackson 如何使用 java 对象?它使用反射对吗?为什么它与 Scala 不同?”,这是这个问题的核心。

您导入的 json4s“ native ”序列化程序使用编译时反射来创建 Writer .

Jackson 使用运行时反射来做同样的事情。

编译时版本效率更高;运行时版本更灵活。

要使用编译时版本,您需要让编译器有足够的信息来选择正确的 Writer基于要序列化的对象的声明类型。这将排除非常通用的编写器方法,例如您建议的方法。有关如何修复该版本的代码,请参阅 @TimP 的答案。

要使用运行时版本,您可以通过 org.json4s.jackson.JsonMethods._ 使用 Jackson。包裹。见 https://github.com/json4s/json4s#jackson

关于scala - json4s 序列化和反序列化泛型类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39901526/

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