使用lift-json使用Map [String,Any]属性反序列化案例类

Jer*_*emy 6 serialization json scala lift

我一直在努力通过lift-json做一些简单的事情:将地图序列化为JSON.

我知道,我知道 - "Root对象还不能是List或Map" - 但我现在愿意将它包装在一个案例类中,但我仍然无法让它工作.感谢一些堆栈溢出帮助,我有序列化工作,但我无法从字符串反序列化.我得到的错误如"没有可用的_值"和"没有关于类型的信息".

网上有其他较旧的帖子,表明类型提示是答案,但这只会导致一个不同的错误,如"不知道如何反序列化_ _".

对于Scala 2.8.0和Lift 2.2:

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

case class MapWrap(data: Map[String, Any])

object Scaffold {
    def main(args: Array[String]) {

        implicit val formats = Serialization.formats(NoTypeHints)
        //implicit val formats = Serialization.formats(ShortTypeHints(List(classOf[MapWrap])))
        //implicit val formats = Serialization.formats(FullTypeHints(List(classOf[MapWrap])))

        val ser = write(new MapWrap(Map[String,Any]("key" -> "value")))
        println("JSON: " + ser)
        println(read[MapWrap](ser))

    }
}
Run Code Online (Sandbox Code Playgroud)

该行println(read[MapWrap](ser))导致投诉"net.liftweb.json.MappingException:数据无可用值".

如何反序化这个case类包装器(或实现我的最终目标:read(write("key" - >"value"))))?

Jon*_*oni 2

如果将 Map 更改为 Map[String, String],则此示例有效。然后序列化器就知道您期望字符串值。如果您的 Map 值是多态的,则需要类型提示。像 Map[String, Animal]; 狗延伸了动物;Cat 扩展了 Animal 等。现在 Animal 类型需要类型提示。它在 JSON 中添加了“jsonClass”字段,用于决定具体的目标类型。

如果你可以升级到2.3-M1,那么你不再需要包装Map,而是可以直接序列化Map:

http://www.scala-tools.org/repo-releases/net/liftweb/lift-json_2.8.1/2.3-M1/