我正在使用最新版的Play框架和其JSON库,像这样 Json.toJson(obj)
。但是toJson无法将任何Scala对象转换为JSON,因为数据结构是未知的。有人建议使用case convert,但我的Scala知识不足。数据来自数据库,但表的结构不是已知的。
我该在哪里寻找进一步创建将此类未知数据结构转换为JSON的转换器呢?
我正在使用最新版的Play框架和其JSON库,像这样 Json.toJson(obj)
。但是toJson无法将任何Scala对象转换为JSON,因为数据结构是未知的。有人建议使用case convert,但我的Scala知识不足。数据来自数据库,但表的结构不是已知的。
我该在哪里寻找进一步创建将此类未知数据结构转换为JSON的转换器呢?
给定以下内容:
object MyWriter {
implicit val anyValWriter = Writes[Any] (a => a match {
case v:String => Json.toJson(v)
case v:Int => Json.toJson(v)
case v:Any => Json.toJson(v.toString)
// or, if you don't care about the value
case _ => throw new RuntimeException("unserializeable type")
})
}
您可以通过在想要序列化Any
的点导入隐式值来使用它:
import MyWriter.anyValWriter
val a: Any = "Foo"
Json.toJson(a)
case
行,包括像List
和Map
这样的集合。这就是为什么这种方法只适用于您想要支持有限数量的类型。 - tehlexx使用json4s,您可以导入以下软件包:
import org.json4s.DefaultFormats
import org.json4s.native.Serialization.write
然后在你的trait内部创建一个隐式变量:
implicit val formats: DefaultFormats = DefaultFormats
write(myObject)
Format[T]
怎么样?(请参见 http://www.playframework.com/documentation/2.2.x/ScalaJsonCombinators)但是,您必须在编译时知道T
的类型,尽管从问题中我不确定这是否会成为一个问题。 - tehlexxasMap
将数据映射到格式[String,Any]
,但是当尝试使用toJson
转换这样的结构时,Scala会抛出错误 -No Json serializer found for type List[scala.collection.Map[String,Any]]
。 - VilisAny
部分仅限于某些类型,如String
、Int
等,则可以使用模式匹配和显式转换这些类型。但是,您需要为要序列化的每种类型都需要一个case
行。 - tehlexx