带有电梯的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

下一篇: Efficient map with case class as a key in Scala?