【问题标题】:Serializing and unserializing case classes with lift-json使用 lift-json 序列化和反序列化案例类
【发布时间】:2011-06-29 13:01:15
【问题描述】:

我正在尝试使用 lift-json 进行基本的序列化/水合,但没有成功。据我从包自述文件中可以看出,这应该可行。帮忙?

我使用 Scala 2.8.0 和 Lift 2.2 为 2.8 与 sbt ("net.liftweb" %% "lift-json" % "2.2") 交叉构建。

import net.liftweb.json._
import net.liftweb.json.Serialization.{read, write}

implicit val formats = Serialization.formats(NoTypeHints)

case class Route(title: String)

val rt = new Route("x277a1")

val ser = write(rt)
// ser: String = {} ... 

val deser = read[Route]("""{"title":"Some Title"}""")
// net.liftweb.json.MappingException: Parsed JSON values do not match with class constructor

【问题讨论】:

  • 如果 Scala 2.9.1 和 liftjson 2.4 可以工作

标签: json serialization scala lift


【解决方案1】:

Lift JSON 的序列化不适用于 REPL 中定义的案例类(paranamer 找不到字节码来读取类型元数据)。用 scalac 编译 Route,然后上面的例子就可以工作了。

【讨论】:

  • 成功了!谢谢!我仍然无法使用 Map[String, Any] 反序列化案例类,但还有其他线程(即使它们还没有帮助)。
【解决方案2】:

每当(反)序列化的类不在类路径上时,都会出现同样的问题。在这种情况下,paranamer 无法读取参数名称。需要提供自定义的ParameterNameReader。

此类问题适用于例如:

  • REPL(如前所述)- 除非您在 REPL 之外定义类并通过类路径添加。
  • Play 框架 - 除非您提供简单的自定义 ParameterNameReader(见下文)或将(反)序列化类加载为 Maven/Play/... 依赖项
  • 随意添加其他情况(您可以编辑此帖子)。

PlayParameterNameReader:

import net.liftweb.json.ParameterNameReader
import java.lang.reflect.Constructor
import play.classloading.enhancers.LocalvariablesNamesEnhancer
import scala.collection.JavaConversions._

object PlayParameterReader extends ParameterNameReader{
    def lookupParameterNames(constructor: Constructor[_]) = LocalvariablesNamesEnhancer.lookupParameterNames(constructor)
}

【讨论】:

  • 这个特殊的 ParameterNameReader 文件应该去哪里为 Play 框架解决这个问题?
  • 好的,在这里找到了答案:groups.google.com/group/liftweb/browse_thread/thread/… 再次感谢您提到 Play 的问题,否则我不确定我会如何解决 ParameterReader 问题!
  • 这是我已经使用了大约 6 周的进一步增强的 ParameterNameReader。效果很棒:gist.github.com/1076885
猜你喜欢
  • 1970-01-01
  • 2011-11-08
  • 2011-06-30
  • 2017-04-10
  • 2013-08-04
  • 2023-03-10
  • 2015-05-27
  • 1970-01-01
  • 2013-08-12
相关资源
最近更新 更多