ToJson (Map ( "success" → true, "message" → 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)) // (*)
}
}
Но он не может быть скомпилирован на двух строках (*)
. Сообщение об ошибке:
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
Это вполне логично: вы пытаетесь преобразовать гетерогенную карту в JsValue:
Map("success" -> true, "message" -> str)
является Map[String, Any]
.
Нет неявного писателя, способного преобразовать a Map[String, Any]
в JsValue
(и их не может быть).
Когда вы пишете Map("success" -> true.toString, "message" -> str)
, вы создаете Map [String, String], и для этого есть писатель.
Я бы написал:
def asSuccessJson = JsObject(Seq("success" -> JsBoolean(true), "message" -> JsString(str))) // (*)
BTW, API-интерфейс JSON безусловно, будет немного "украшен" в следующих 2-го выпусках игр...