2012-03-28 6 views
2

Dies ist mein Code:toJson (Map ("Erfolg" -> true "Nachricht" -> str)) nicht in play2 kompiliert werden

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

} 

Aber es kann nicht auf zwei kompiliert werden (*) Zeilen. Die Fehlermeldung lautet:

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. 

Ich habe zu schreiben als:

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

Hinweis true.toString. Es funktioniert aber langweilig.

Wie es zu beheben?

Antwort

6

Es ist ganz logisch: Sie versuchen, eine heterogene Karte in einen JsValue zu konvertieren:

Map("success" -> true, "message" -> str) ein Map[String, Any] ist.

Es gibt keinen impliziten Schreiber, der in der Lage ist, eine Map[String, Any] in eine JsValue umzuwandeln (und es kann keine geben).

Wenn Sie Map("success" -> true.toString, "message" -> str) schreiben, erstellen Sie eine Map [String, String], und es gibt einen Writer dafür.

Ich würde schreiben:

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

BTW, die JSON API wird sicherlich "verschönert" werden, um ein Bit in nächsten Versionen Spiel 2 ...

+0

Warten auf die nächste Version, aktuelle ist nicht perfekt . – Freewind

+0

aktuelle api ist ein bisschen roh, aber es bringt alles, was wir brauchen, ohne jede Magie, jede Introspektion. Diese Prinzipien werden mit etwas Zucker und einigen neuen Werkzeugen beibehalten werden ... sei geduldig;) – mandubian

+1

In der Theorie wäre es möglich, einen Serialisierer zu schreiben, der auf Laufzeit versucht, alle Werte von Map [String, Any] mit vorhandenen Serialisierern zu serialisieren? Es ist nicht möglich, format-agnostische API-Layer zu schreiben, ohne dass die Any-Funktion während der Laufzeit serialisiert werden kann – Ciantic