ether-json provee serialización y deserialización JSON con una interfaz JsonCodec independiente de la implementación subyacente (Jackson por defecto).
Instalación
<dependency>
<groupId>dev.rafex.ether.json</groupId>
<artifactId>ether-json</artifactId>
<version>8.0.0-SNAPSHOT</version>
</dependency>
Crear un JsonCodec
JsonCodec codec = JsonCodecBuilder.create().build();
JsonCodec strict = JsonCodecBuilder.strict().build();
JsonCodec lenient = JsonCodecBuilder.lenient().build();
JsonCodec custom = JsonCodecBuilder.create()
.failOnUnknownProperties(false)
.writeDatesAsTimestamps(false)
.prettyPrint(false)
.build();
Serialización
record User(long id, String name, String email) {}
User user = new User(1L, "Alice", "alice@example.com");
String json = codec.toJson(user);
String pretty = codec.toPrettyJson(user);
byte[] bytes = codec.toJsonBytes(user);
try (OutputStream out = Files.newOutputStream(path)) {
codec.writeValue(out, user);
}
Deserialización
User user = codec.readValue(json, User.class);
User user = codec.readValue(bytes, User.class);
try (InputStream in = Files.newInputStream(path)) {
User user = codec.readValue(in, User.class);
}
List<User> users = codec.readValue(json, new TypeReference<List<User>>() {});
Map<String, Object> map = codec.readValue(json, new TypeReference<Map<String, Object>>() {});
Árbol de nodos (JsonNode)
JsonNode root = codec.readTree(json);
String name = root.get("name").asText();
int age = root.get("age").asInt();
boolean hasX = root.has("optionalField");
User user = codec.treeToValue(root, User.class);
Integración con ether-di
public class AppContainer {
private final Lazy<JsonCodec> json = new Lazy<>(() ->
JsonCodecBuilder.create().writeDatesAsTimestamps(false).build());
public JsonCodec json() { return json.get(); }
}
Uso típico en endpoints HTTP
CreateUserRequest req = codec.readValue(exchange.bodyBytes(), CreateUserRequest.class);
User created = userService.create(req);
exchange.json(201, created);
Más información