使用lift-json序列化和反序列化案例类

时间:2011-02-18 01:52:11

标签: json serialization scala lift

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

我正在使用Scala 2.8.0和Lift 2.2为sbt交叉构建2.8(“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

2 个答案:

答案 0 :(得分:10)

提升JSON的序列化不适用于REPL中定义的案例类(paranamer无法找到字节码来读取类型元数据)。使用scalac编译路由,然后上面的示例工作。

答案 1 :(得分:2)

每次(de)serialuzed类不在类路径上时,同样的问题也适用。在这种情况下,paranamer无法读取参数名称。有必要提供自定义ParameterNameReader。

这样的问题适用于例如:

  • REPL(如上所述) - 除非您在REPL之外定义类并通过classpath添加。
  • Play Framework - 除非您提供简单的自定义ParameterNameReader(见下文)或将(de)序列化类加载为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)
}