2.1

2013-01-08 10 views
11

私は新しいプレイ2.1-RC1のフレームワークを使用していると私は、オプション[]フィールドを持つクラスを持って、このような何か:私は2.1

import play.api.libs.json._ 
import play.api.libs.json.util._ 
import play.api.libs.json.Reads._ 
import play.api.libs.json.Writes._ 
import play.api.libs.json.Format._ 
import play.api.libs.functional.syntax._ 

case class Test(name: String, value: Option[String]) 

object Test { 
    implicit val testFormat = (
    (__ \ "name").format[String] and 
    (__ \ "value").format[Option[String]] 
)(Test.apply, unlift(Test.unapply)) 
    def fromJson(js: String): Test = { 
    Json.fromJson[Test](Json.parse(js)).fold(
     valid = { t => t}, 
     invalid = { e => { 
      val missingField = (e(0)._1).toString.substring(1) 
      val badJs = js.trim 
      val newJs = badJs.substring(0, badJs.length()-1)+",\""+missingField+"\":null}" 
      fromJson(newJs) 
     }} 
    ) 
    } 
} 

オプションの「値」データを省略したJSON文字列を処理できるようにしたい

val y = """{"name":"someone"}""" 

(編集済みの質問) 検証ステップに示すように、私は(むしろ不器用)JSON文字列を書き換えることができますが、 は、私はオプションのフィールドが不足しているため、Noneを供給しないために使用できるシンプルなパターンが存在しますか?このリライトはネストされた構造や、単に欠落したフィールドを追加できない場所では機能しません。

答えて

6

あなたは、単にこれを行うことができます。

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

case class Test(name: String, value: Option[String]) 

implicit val testFormat = Json.format[Test] 

def hoge = Action(Json.parse.json) { request => 
    Json.fromJson[Test](request.body) 
    ... 
} 
+0

唯一の問題は、jsonが要求からではなくwebsocketから来ていることです。 – NickStoughton

+0

@NickStoughton 'Iteratee.foreach [JsValue](イベント=> Json.fromJson [テスト](イベント))' – sndyuk

+0

@NickStoughton JFYI https://github.com/playframework/Play20/blob/master/samples/scala/websocket -chat/app/models/ChatRoom.scala – sndyuk

3

OK ...ので、答えは非常に簡単です。任意のフィールドには

fomatOpt() 

を使用してください。したがって、テストフォーマッタは次のようになります。

+2

Reads/Writes/Formatの注入にスカラーマクロを使用する場合はどうですか?たとえば、あなたのケースでは と書くことができます。暗黙的なval testFormat = Json.format [テスト] この場合、オプションのJSON値はどのように管理できますか? – visionary