Zum Inhalt springen
Anjunar/ DOCS

Serialisieren

Ein Objekt wird über seine annotierten Properties zu JSON. Leere Werte fallen weg, und jedes Objekt sagt, was es ist.

Modell

Veränderbare Klassen mit @JsonbProperty

Nur Properties mit @JsonbProperty nehmen teil. In Scala muss die Annotation am Feld ankommen, daher die Meta-Annotation @field. DTO kennzeichnet eine Klasse als Objekt, in das der Mapper hinabsteigt.

scala
import com.anjunar.json.mapper.provider.DTO import jakarta.json.bind.annotation.JsonbProperty import scala.annotation.meta.field class AddressDto extends DTO { @(JsonbProperty @field) var city: String = null @(JsonbProperty @field) var zipCode: String = null } class UserDto extends DTO { @(JsonbProperty @field) var name: String = null @(JsonbProperty @field) var age: Int = 0 @(JsonbProperty @field) var address: AddressDto = null @(JsonbProperty @field) var tags: java.util.List[String] = new java.util.ArrayList[String]() }
Aufruf

serialize mit aufgelöstem Typ

Der Mapper arbeitet auf einer ResolvedClass aus scala-universe, die die generischen Typen von Collections und Maps kennt. Das letzte Argument erzeugt Hilfsobjekte wie Regeln; bei einfachen DTOs wird es nie aufgerufen.

scala
import com.anjunar.json.mapper.JsonMapper import com.anjunar.scala.universe.TypeResolver val user = new UserDto user.name = "Patrick" user.age = 34 user.address = new AddressDto user.address.city = "Berlin" user.address.zipCode = "10115" val json = JsonMapper.serialize( user, TypeResolver.resolve(classOf[UserDto]), null, // no EntityGraph [T] => (_: Class[T]) => null.asInstanceOf[T] // nothing to inject )
Ausgabe
{"name":"Patrick","age":34,"address":{"city":"Berlin","zipCode":"10115","@type":"AddressDto"},"@type":"UserDto"}
Ausgabe

Was geschrieben wird und was nicht

Die Ausgabe ist knapp und sagt nur das Nötige. Lies diese Regeln, bevor du dich darauf verlässt, dass ein Feld da ist.

Regeln
null, leere Strings, leere Collections und false fallen weg.
Ein Objekt ohne geschriebene Property fällt ebenfalls weg.
Jedes nicht leere Objekt bekommt @type, seinen einfachen Klassennamen; Hibernate-Proxy-Suffixe werden entfernt.
@JsonbProperty("name") benennt das Feld im JSON um.
@type ist für den Leser

Die Deserialisierung liest @type nicht; sie nutzt immer den deklarierten Typ der Property. Clients unterscheiden damit Objekte.