web-dev-qa-db-ja.com

ScalaでJSONオブジェクトを作成する方法は?

まず、GoogleやStackOverflowでそのような質問をたくさん検索しましたが、(驚いたことに)有用な回答が見つかりませんでした。

Play FrameworkJavaでJSON配列を作成する方法 および JavaでJSONオブジェクトを作成する方法 について何かを見ましたが、私は望んでいませんPlayフレームワークを使用するには、JSONオブジェクトの作成がScala to Javaと異なるかどうかがわかりません。

以下は作成したいJSONです。後でオブジェクトを文字列に変換して、POSTリクエスト(API呼び出しを介して)リクエストを介して送信します。

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

Scalaでそのようなことをするにはどうすればよいですか?

11
Paladini

シリアライゼーション/デシリアライゼーションを処理するライブラリを使用する必要があります。 Spray JsonPlay Json の間で選択することを検討します。

プロセスがPlayでどのように機能するかを最初に説明します。これは、スプレーのプロセスと非常に似ています。

クラスがあり、文字列としてインスタンスと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]
}

ご覧のとおり、これは主にこの2つの間の選択の問題です。どちらもまだ改善されており、おそらく近い将来になるでしょう。

ベンチマークにもよりますが、一方が他方より数ミリ秒(通常はスプレー)だけ優れていることがわかります。

個人的なプロジェクトでSprayPlayを使用しているが、根本的に異なるものを見つけたとは言えない別のものへ。

編集:

そして最後にあなたの質問に答えるために、MyClassからString(シリアライズ)に行くには、次のようなことをします:

PLAY:  Json.stringify(Json.toJson(myClass))
SPRAY: myClass.toJson.compactPrint

そして、逆シリアル化:

PLAY:  Json.parse(string).as[MyClass]
SPRAY: myClass.parseJson.convertTo[MyClass]
10
tasegula

自分でライブラリを使用したくない場合は、ライブラリを使用する必要があります。

注:クールJava Gsonライブラリは、Scalaで使用する場合、多くのマジックを失います。コレクションがわからないので、このライブラリを使用する場合は、「Scalaリスト」をJava.util.Listに変換し、その後Gsonを使用する必要があります。

3
Kordi