toJson (Map ("success" -> true, "message" -> str)) не может быть скомпилировано в play2 - PullRequest
2 голосов
/ 28 марта 2012

Это мой код:

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)) // (*)
  }

}

Но он не может быть скомпилирован в две (*) строки.Сообщение об ошибке:

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.

Я должен записать его как:

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

Уведомление true.toString.Работает но скучно.

Как это исправить?

1 Ответ

6 голосов
/ 28 марта 2012

Это вполне логично: вы пытаетесь преобразовать разнородную карту в JsValue:

Map("success" -> true, "message" -> str) - это Map[String, Any].

Не существует неявного средства записи, способного преобразовать Map[String, Any] в JsValue (а их не может быть).

Когда вы пишете Map("success" -> true.toString, "message" -> str), вы создаете карту [String, String], и для этого есть писатель.

Я бы написал:

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

Кстати, JSON API непременно будет "украшен" в следующих выпусках Play 2 ...

...