加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

发布时间:2020-12-16 18:45:27 所属栏目:安全 来源:网络整理
导读:因为我正在处理泛型类型因此我不能使用特定的案例类.然后我创建了一个泛型util,它序列化和反序列化泛型对象. import org.json4simport org.json4s.Formats._import org.json4s.native.JsonMethods._object JsonHelper { def json2Object[O](input: String) :
因为我正在处理泛型类型因此我不能使用特定的案例类.然后我创建了一个泛型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

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

解决方法

在上面的评论中,你问过“所以杰克逊如何使用java对象?它使用反射权吗?为什么它与Scala不同?”,这是这个问题的核心.

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

杰克逊使用运行时反射来做同样的事情.

编译时版本更有效;运行时版本更灵活.

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读