带有电梯的Map [String,Any]属性反序列化案例类
我一直在努力应对通过lift-json几天来简单的事情:将地图序列化为JSON。
我知道,我知道 - “根对象还不能成为List或Map” - 但我现在愿意包装在一个case类中,而且我仍然无法使其工作。 感谢一些堆栈溢出帮助,我已经有序列化的工作,但我不能从一个字符串反序列化它。 我收到诸如“没有_的可用值”和“没有关于类型的已知信息”之类的错误。
网络上还有其他较旧的帖子指出类型提示是答案,但是这只会导致不同的错误,如“不知道如何反序列化__”。
对于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))
}
}
println(read[MapWrap](ser))
行println(read[MapWrap](ser))
导致投诉“net.liftweb.json.MappingException:数据没有可用值。”
我怎样才能反序列化这个案例类包装(或实现我的最终目标:读(写(地图(“键” - >“价值”))))?
如果将Map更改为Map [String,String],则此示例有效。 然后序列化程序知道你期望字符串值。 如果您的Map值是多态的,则需要类型提示。 像地图[String,Animal]; 狗延伸动物; 猫扩展动物等。现在需要动物类型的提示。 它为JSON添加了“jsonClass”字段,用于确定具体的目标类型。
如果你可以升级到2.3-M1,那么你不再需要包装地图,但可以直接序列化地图:
http://www.scala-tools.org/repo-releases/net/liftweb/lift-json_2.8.1/2.3-M1/
或者,您可以使用将case class params设置为JObject并使用.values方法:
import org.junit.{Test, Assert, Before}
import org.junit.Assert._
import net.liftweb.json._
case class Element(title:String, params:JObject)
@Test
class JsonParserTest{
implicit val formats = Serialization.formats(NoTypeHints)
@Test
def testLiftMapToAny{
val result = parse("""{"title":"foobar","params":{"one":1,"two":2, "other": "give"}}""").extract[Element]
assertEquals("foobar", result.title)
assertEquals(Map("one" -> 1, "two" -> 2, "other" -> "give"), result.params.values)
}
}
链接地址: http://www.djcxy.com/p/68267.html
上一篇: Deserializing case classes with Map[String,Any] properties with lift