6

ScalaクラスからのJSONオブジェクトのレンダリングに関して簡単な質問があります。デシリアライザー(読み取り、書き込み)を実装する必要があるのはなぜですか。

私は次のケースクラスを持っています:

case class User(firstname:String, lastname:String, age:Int)

そして私のコントローラーでは:

val milo:User = new User("Sam","Fisher",23);

Json.toJson(milo);

コンパイルエラーが発生します:タイプmodels.UserのJsonデシリアライザーが見つかりません。このタイプの暗黙の書き込みまたはフォーマットを実装してみてください。

以前のプロジェクトでは、それが機能するためにクラスにリーダー、ライターオブジェクトを実装する必要があり、非常に面倒でした。

object UserWebsite {
  implicit object UserWebsiteReads extends Format[UserWebsite] {

    def reads(json: JsValue) = UserWebsite(
      (json \ "email").as[String],
      (json \ "url").as[String],
      (json \ "imageurl").as[String])

    def writes(ts: UserWebsite) = JsObject(Seq(
      "email" -> JsString(ts.email),
      "url" -> JsString(ts.url),
      "imageurl" -> JsString(ts.imageurl)))
  }
} 
4

5 に答える 5

9

2.1-RC1 にアップグレードすることを強くお勧めします。なぜなら、JSON ライター/リーダーは非常に簡単に定義できるからです (詳細はこちら) 。

ただし、いくつかのエラーを回避するために、インポートに関するヒントを提供します。 - これらのインポートのみを使用してください。(json.Reads が含まれていないことに注意してください)

import play.api.libs.json._
import play.api.libs.functional.syntax._
import play.api.libs.json.Writes._

Json との間でクラスの書き込み/読み取りを行うために、このコードを記述するだけで済みます (もちろん、User代わりにAddress:

implicit val addressWrites = Json.writes[Address]
implicit val addressReads = Json.reads[Address]

現在、それらは自動的に使用されます。

書き込み例:

Ok(Json.toJson(entities.map(s => Json.toJson(s))))

読み取りの例(本文から json を読み取ってエンティティを作成するために POST を実行する例を示します)addressReadsここで使用されていることに注意してください

def create = Action(parse.json) { request =>
        request.body.validate(addressReads).map { entity =>
          Addresses.insert(entity)
          Ok(RestResponses.toJson(RestResponse(OK, "Succesfully created a new entity.")))
        }.recover { Result =>
          BadRequest(RestResponses.toJson(RestResponse(BAD_REQUEST, "Unable to transform JSON body to entity.")))
        }
}

結論として、彼らは JSON に関して物事を非常にシンプルにすることを試みました (そして成功しました)。

于 2012-11-28T11:36:16.370 に答える
3

play 2.0.x を使用している場合は、次のことができます

import com.codahale.jerkson.Json._

generate(milo)

generate はリフレクションを使用してそれを行います。

play 2.1 では、Json.writes を使用して、作成しなければならなかった暗黙的なオブジェクトのマクロを作成できます。ランタイム リフレクションは不要です。

import play.api.libs.json._
import play.api.libs.functional.syntax._

implicit val userWrites = Json.writes[User]
Json.toJson(milo)
于 2012-11-27T23:18:47.093 に答える
0

あなたの場合、JSON.format マクロを使用します。

import play.api.libs.json._
implicit val userFormat = Json.format[User]
val milo = new User("Sam", "Fisher", 23)
val json = Json.toJson(milo)
于 2016-04-19T15:05:13.533 に答える
0

私は自分のプロジェクトで jerkson (基本的には jackson のラッパー) を使用して、オブジェクトを json 文字列に変換しています。

これを行う最も簡単な方法は次のとおりです。

import com.codehale.jerkson.Json._
...
generate(milo)
...

ObjectMapper を構成する必要がある場合 (カスタム シリアライザー/デシリアライザーの追加、出力形式の構成など)、com.codehale.jerkson.Jsonクラスを拡張するオブジェクトを作成することで実行できます。

package utils

import org.codehaus.jackson.map._
import org.codehaus.jackson.{Version, JsonGenerator, JsonParser}
import com.codahale.jerkson.Json
import org.codehaus.jackson.map.module.SimpleModule
import org.codehaus.jackson.map.annotate.JsonSerialize

object CustomJson extends Json {

  val module = new SimpleModule("CustomSerializer", Version.unknownVersion())

  // --- (SERIALIZERS) ---
  // Example:
  // module.addSerializer(classOf[Enumeration#Value], EnumerationSerializer)
  // --- (DESERIALIZERS) ---
  // Example:
  // module.addDeserializer(classOf[MyEnumType], new EnumerationDeserializer[MyEnumType](MyEnumTypes))

  mapper.setSerializationInclusion(JsonSerialize.Inclusion.NON_NULL)
  mapper.setSerializationConfig(mapper.getSerializationConfig.without(SerializationConfig.Feature.WRITE_NULL_MAP_VALUES))
  mapper.registerModule(module)
}

コードで使用するには:

import utils.CustomJson._
...
generate(milo)
...
于 2012-11-29T14:41:41.620 に答える
0

実際、これは非常に簡単です。最初にインポートします:

import play.api.libs.json._

User はケース クラスであるため、Json.writes[] を使用して Json 書き込みを自動的に作成できます。

val milo:User = new User("Millad","Dagdoni",23)
implicit val userImplicitWrites = Json.writes[User]
Json.toJson(milo)

ドキュメントには見つかりませんでしたが、API へのリンクは次のとおりです: http://www.playframework.com/documentation/2.2.x/api/scala/index.html#play.api.libs.json .Json $

于 2014-04-04T07:08:36.770 に答える