你应该使用一个处理序列化/反序列化的库。我建议在
Spray Json和
Play Json之间选择。
我先向你解释一下使用
Play的过程,它与Spray非常相似。
假设你有一个类和一个包含实例和json字符串的对象:
case class MyClass(id: Int,
name: String,
description: String)
object Data {
val obj: MyClass = MyClass(1, "me", "awesome")
val str: String =
"""
|{
| "id": 1,
| "name": "me",
| "description": "awesome"
|}
""".stripMargin
}
为了对 MyClass
进行序列化/反序列化,您需要一个隐式格式化程序,专门针对此类对象,在 Play 中创建包含此格式化程序的对象。
trait MyClassPlayProtocol {
implicit val formatAbility = Json.format[Ability]
}
object MyClassPlayProtocol extends MyClassPlayProtocol
序列化/反序列化的过程大概是这样:
object PlayData {
import play.api.libs.json.JsValue
import play.api.libs.json.Json
import MyClassPlayProtocol._
import General._
val str2Json: JsValue = Json.parse(str)
val obj2Json: JsValue = Json.toJson(obj)
val json2Str: String = Json.stringify(str2Json)
val json2Obj: MyClass = obj2Json.as[MyClass]
}
在Spray中,协议将如下所示:
trait MyClassSprayProtocol extends DefaultJsonProtocol {
implicit val myClassFormat = jsonFormat3(MyClass)
}
object MyClassSprayProtocol extends MyClassSprayProtocol
以及序列化/反序列化:
object SprayData {
import spray.json._
import MyClassSprayProtocol._
import General._
val str2Json: JsValue = str.parseJson
val obj2Json: JsValue = obj.toJson
val json2Str: String = str2Json.compactPrint
val json2Obj: MyClass = obj2Json.convertTo[MyClass]
}
正如你所看到的,主要是在这两者之间进行选择。两者都得到了改进,并且可能在不久的将来会有更多的改进。
根据基准测试,你会发现其中一个比另一个快几毫秒(通常是Spray)。
就我个人而言,在工作中我使用Spray,在一些个人项目中我使用Play,我不能说我从一个项目中找到了与另一个有根本不同的东西。
编辑:
最终回答你的问题,要将MyClass
转换为String
(序列化),你可以像这样操作:
PLAY: Json.stringify(Json.toJson(myClass))
SPRAY: myClass.toJson.compactPrint
然后是反序列化:
PLAY: Json.parse(string).as[MyClass]
SPRAY: myClass.parseJson.convertTo[MyClass]