Ich habe einen Anwendungsfall, in dem ich eine User-Entity zu json serialisieren möchte. Diese Benutzereinheit enthält private Felder, die nicht angezeigt werden sollen, z. B. ein Kennwort.Serialize auf Json mit einer benutzerdefinierten Schreibt in Scala Play 2.4 gesetzt
Ich bin eine benutzerdefinierte OWrites mit damit umgehen, wenn ich einen einzelnen Benutzer zurück:
val userSafeWrites: OWrites[User] = (
(__ \ EMAIL_FIELD).write[String] ~
(__ \ FIRST_NAME_FIELD).write[String] ~
(__ \ LAST_NAME_FIELD).write[String] ~
(__ \ PHONE_NUMBER_FIELD).write[Option[String]] ~
(__ \ ID_FIELD).write[Long]
)(p => (p.email, p.firstName, p.lastName, p.phoneNumber, p._id.get))
und ich das OWrites dann angeben, anstatt die impliziten verwenden:
Ok(Json.toJson(user)(User.userSafeWrites))
jedoch Ich muss jetzt eine Set[User]
zurückgeben.
Wie kann ich das tun? Muss ich eine OWrites[Set[User]]
implementieren? Ich kann verstehen, wie das zu tun, wenn ich mit den Ergebnissen, wie ein Objekt mit einem Feldnamen zurück war:
{
"users": [{user1}, {user2}]
}
Allerdings möchte ich einfach ein Array zurück, mit dem Ausgang in anderen Endpunkten comform :
[{user1}, {user2}]
Oder sollte ich jedes Element des Satzes auf einen JSObject und gelten die benutzerdefinierten OWrites jedem Objekt abbilden? Was wäre der effizienteste Weg, das zu tun?
Ich fühle das ist etwas ziemlich einfach und ich bin nur ein Trottel für nicht die Antwort selbst zu finden.
Sie müssen Ihre 'OWrites [User]' im impliziten Bereich "exponieren" (entweder explizit importieren, oder im Companion-Objekt von 'User'). Dann werden die von Play bereitgestellten 'Schreibt [Set [T]] 'mit' T = User 'arbeiten, ohne dass mehr zu tun ist. – cchantep
In diesem Fall kann ich die OWrites nicht als implizit haben, weil ich bereits einen anderen OWrites [Benutzer] im impliziten Bereich habe. Ich habe zwei verschiedene Serialisierungsanforderungen für diese Klasse. – redwulf
Nichts hindert Sie, dieses als ein lokales implizites zu importieren (nur innerhalb des Bereichs einer Funktion, nicht für die ganze Klasse). – cchantep