2012-03-28 2 views
2

でコンパイルすることはできませんこれは私のコードです:toJson(地図( "成功" - - >真、 "メッセージ"> strが))PLAY2

import play.api.mvc._ 
import play.api.libs.json._ 
import play.api.libs.json.Json._ 
import play.api.libs.json.Writes._ 

class BaseController extends Controller with Secured with DefaultWrites { 

    private implicit def str2json(str: String) = new { 
    def asSuccessJson = toJson(Map("success" -> true, "message" -> str)) // (*) 
    def asFailedJson = toJson(Map("success" -> false, "message" -> str)) // (*) 
    } 

} 

しかし、それは2でコンパイルすることはできません(*)行。エラーメッセージは次のとおりです。

def asSuccessJson = toJson(Map("success" -> true.toString, "message" -> str)) 

お知らせtrue.toString

Multiple markers at this line 
- No Json deserializer found for type scala.collection.immutable.Map[java.lang.String,Any]. Try 
to implement an implicit Writes or Format for this type. 
- not enough arguments for method toJson: (implicit tjs: 
    play.api.libs.json.Writes[scala.collection.immutable.Map[java.lang.String,Any]]) 
    play.api.libs.json.JsValue.Unspecified value parameter tjs. 

私はとしてそれを記述する必要があります。それはうまくいくが退屈だ。

修正方法?

答えて

6

それは非常に論理的だ:あなたはJsValueに異質マップを変換しよう:

Map("success" -> true, "message" -> str)Map[String, Any]です。

Map[String, Any]JsValueに変換することができる暗黙の書き込み機能はありません(任意のものはありません)。

Map("success" -> true.toString, "message" -> str)と書くと、Map [String、String]が作成され、そこにライターがあります。

私が書くでしょう:

def asSuccessJson = JsObject(Seq("success" -> JsBoolean(true), "message" -> JsString(str))) // (*) 

をところで、JSON APIは確か

+0

...プレイ2の次のリリースでビットを「美化」される次のリリースを待つが、現在のものは完璧ではありません。 – Freewind

+0

現在のAPIは少し粗いですが、魔法やイントロスペクションなしで必要なものすべてを提供します。これらの原則は、いくつかの砂糖といくつかの新しいツールで守られています...) – mandubian

+1

理論上、実行時にMap [String、Any]のすべての値を既存のシリアライザでシリアル化しようとするシリアライザを書くことは可能でしょうか?可能であれば、実行時に直列化する機能を持たない、フォーマットに依存しないAPIレイヤーを書くことはできません – Ciantic

関連する問題