πΎ Java Records πΏ with Jackson 2.12
Carlos Chacin βπ½
Posted on March 4, 2021
In the previous article about Java 14 Records, we saw how to start creating Records to avoid writing much boilerplate code that the compiler would generate for us.
Now the next steps are to see how we can serialize records to JSON and deserialize JSON to records to be able to use them as a request/response representation for microservices.
In this case, we would use the Jackson 2.12+.
Continuing with the same example that we used in the previous article, we would need to add Jackson Dependencies to our existing pom.xml file:
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.12.0</version>
</dependency>
πΎ Now letβs see our example Record:
record Person(
@JsonProperty("first_name") String firstName,
@JsonProperty("last_name") String lastName,
String address,
Date birthday,
List<String> achievements) {
}
π‘ Java 14+ compiler would generate all of the following:
$ javap -p Person.class
final class Person extends java.lang.Record {
private final java.lang.String firstName;
private final java.lang.String lastName;
private final java.lang.String address;
private final java.util.Date birthday;
private final java.util.List<java.lang.String> achievements;
public Person(
java.lang.String,
java.lang.String,
java.lang.String,
java.util.Date,
java.util.List<java.lang.String>);
public final java.lang.String toString();
public final int hashCode();
public final boolean equals(java.lang.Object);
public java.lang.String firstName();
public java.lang.String lastName();
public java.lang.String address();
public java.util.Date birthday();
public java.util.List<java.lang.String> achievements();
}
π¨ Our test setup:
final ObjectMapper mapper = new ObjectMapper()
.enable(SerializationFeature.INDENT_OUTPUT);
To serialize/deserialize a record like this:
var person = new Person(
"John",
"Doe",
"USA",
new Date(981291289182L),
List.of("Speaker")
);
To/From a json string like this:
{
"first_name" : "John",
"last_name" : "Doe",
"address" : "USA",
"birthday" : 981291289182,
"achievements" : ["Speaker"]
}
π Testing Serialization
@Test
void serializeRecord() throws Exception {
// Given
var person = new Person(
"John",
"Doe",
"USA",
new Date(981291289182L),
List.of("Speaker")
);
var json = """
{
"first_name" : "John",
"last_name" : "Doe",
"address" : "USA",
"birthday" : 981291289182,
"achievements" : ["Speaker"]
}""";
// When
var serialized = mapper.writeValueAsString(person);
// Then
assertThat(serialized).isEqualTo(json);
}
π Testing Deserialization
Letβs use the same record to try the deserialization using also the same configuration:
@Test
void deserializeRecord() throws Exception {
// Given
var person = new Person(
"John",
"Doe",
"USA",
new Date(981291289182L),
List.of("Speaker")
);
var json = """
{
"first_name" : "John",
"last_name" : "Doe",
"address" : "USA",
"birthday" : 981291289182,
"achievements" : ["Speaker"]
}""";
// When
var deserialized = mapper.readValue(json, Person.class);
// Then
assertThat(deserialized).isEqualTo(person);
}
π Conclusions
Posted on March 4, 2021
Join Our Newsletter. No Spam, Only the good stuff.
Sign up to receive the latest update from our blog.