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

标签 json serialization 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))

    }
}

线路println(read[MapWrap](ser))导致投诉“net.liftweb.json.MappingException:没有可用的数据值。”

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

最佳答案

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

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

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

关于json - 使用 Lift-json 使用 Map[String,Any] 属性反序列化案例类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5051290/

相关文章:

c# - 这是对返回 JSON 数据的动态关键字的正确使用吗?

C# XML 数据反序列化 - 基于引用 ID 应用对象关系

serialization - 使用 Json.net 往返 F# 可区分联合时出现问题

scala - 如何在 TreeMap 中使用 Scala 的 Ordering#reverse?

generics - 具有相同特征但类型参数不同的组合

javascript - 如何在不需要刷新页面的情况下进行验证?

java - 如何使用现有的json文件作为模板创建json文件?

arrays - 从 TicketMasters API 中提取数据 (Swift 4.0/Decodable)

serialization - 如何序列化 SAP 业务对象?

scala - 如何在 Scala 中找到两个日期时间之间的时差?