Beim Herumspielen mit dem Play! Framework bin ich heute über die etwas klobige JSON-Integration zum Lesen des Body einer HTTP-Anfrage gestolpert. Der empfohlene Ansatz, typsicheres JSON zu verwenden und den Baum zu durchsuchen, während Sie Ihr benutzerdefiniertes Objekt erstellen oder ein Format verwenden, scheint für die meisten Standardsituationen, die von den Standardbibliotheken Jerkson und Jackson (in Play! enthalten) anmutig gehandhabt werden, ziemlich umständlich zu sein. In diesem Blog beschreibe ich einen Ansatz, der einen benutzerdefinierten BodyParser verwendet, um eine einfachere Lösung zu finden.
Der empfohlene Ansatz zum Schreiben einer Aktion, die JSON verarbeitet, besteht darin, ein Format für Ihre Fallklasse zu schreiben, etwa so:
[scala]
case class Person (id: Long, firstName: String, lastName: String)
object Person {
def all():List[Person] = ...
def create(p : Person):Long = ...
import play.api.libs.json.
implicit object PersonFormat extends Format[Person] {
def reads(json: JsValue) = Person(
(json "id").as[Long],
(json "vorname").as[String],
(json "nachname").as[String])
def writes(p: Person) = JsObject(Seq(
"id" -> JsNumber(p.id),
"vorname" -> JsString(p.vorname),
"nachname" -> JsString(p.nachname)))
}
}
[/scala]
Der JSON-Parser kann nun das Format in den Aktionen wie folgt verwenden:
[scala]
import play.api.mvc.
import play.api.libs.json.Json.
object People extends Controller {
def list = Action {
Ok(toJson(Person.all()))
}
def save = Action(parse.json) { implicit request =>
var id = Person.create(request.body.as[Person])
Ok(toJson(Map("id" -> id)))
[/scala] }
}
In Zeile 6 wird das Format implizit zur Konvertierung der Person-Objekte in JSON verwendet. In Zeile 10 wird das Standard-JSON-Parsing in der Aktion verwendet. In Zeile 11 wird der geparste Body unter Verwendung des Formats wieder implizit in eine Person umgewandelt und an den Rest der Anwendung übergeben.
Verfasst von
Maarten Winkels
Unsere Ideen
Weitere Blogs

Wo die GitHub Copilot Erweiterungspunkte die Governance brechen
Viele der jüngsten Ergänzungen des GitHub Copilot-Ökosystems bieten einen echten Mehrwert für einzelne Entwickler, erweitern aber auch die...
Rob Bos
Contact

