如何在Scala中创建JSON对象?

时间:2015-10-23 16:36:45

标签: json scala

首先,我在Google和StackOverflow上搜索了很多类似的问题,但我没有找到任何有用的答案(令我惊讶的是)。

我看到了关于Play Frameworkhow to create JSON array in Javahow to create JSON objects in Java的内容,但我不想使用Play Framework,我不知道JSON对象的创建是否与Scala不同到Java。

以下是我想要创建的JSON。稍后我会将对象转换为字符串,以通过POST请求(通过API调用)发送它。

{
    "start_relative": {
        "value": "5",
        "unit": "years"
    },
    "metrics": [
        {
        "name": "DP_391366" # S-Temperature - Celsius
        },
        {
            "name": "DP_812682" # Sensor-A4 Luminosity
        }
    ]
}

如何在Scala中执行类似的操作?

2 个答案:

答案 0 :(得分:8)

您应该使用处理序列化/反序列化的库。 我会考虑在Spray JsonPlay Json之间进行选择。

我将首先向您解释该过程如何与播放一起使用,它与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进行序列化/反序列化,您需要一个特定于此的隐式格式化程序,因此您将使用播放创建一个包含此格式化程序的对象。

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]

答案 1 :(得分:3)

如果你不想让它自己做,你需要使用一个库:

注意:如果你想将它与Scala一起使用,那么很酷的Java Gson LIbrary会丢失很多Magic,因为他们不知道Collections。因此,如果你想使用这个库,你必须将“Scala List”转换为java.util.List,然后使用Gson。