まず、GoogleやStackOverflowでそのような質問をたくさん検索しましたが、(驚いたことに)有用な回答が見つかりませんでした。
Play Framework 、 Javaで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でそのようなことをするにはどうすればよいですか?
シリアライゼーション/デシリアライゼーションを処理するライブラリを使用する必要があります。 Spray Json と Play 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つの間の選択の問題です。どちらもまだ改善されており、おそらく近い将来になるでしょう。
ベンチマークにもよりますが、一方が他方より数ミリ秒(通常はスプレー)だけ優れていることがわかります。
個人的なプロジェクトで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]
自分でライブラリを使用したくない場合は、ライブラリを使用する必要があります。
注:クールJava Gsonライブラリは、Scalaで使用する場合、多くのマジックを失います。コレクションがわからないので、このライブラリを使用する場合は、「Scalaリスト」をJava.util.Listに変換し、その後Gsonを使用する必要があります。