RecordJsonSerDeser188Test.java
package com.fasterxml.jackson.databind.records;
import java.io.IOException;
import org.junit.jupiter.api.Test;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.deser.std.StdScalarDeserializer;
import com.fasterxml.jackson.databind.ser.std.StdScalarSerializer;
import com.fasterxml.jackson.databind.testutil.DatabindTestUtil;
import static org.junit.jupiter.api.Assertions.assertEquals;
/**
* Test to verify that both {@link JsonSerialize} and {@link com.fasterxml.jackson.databind.annotation.JsonDeserialize}
* work on records, as opposed to
* [jackson#188 discussions](https://github.com/FasterXML/jackson/discussions/188#discussioncomment-11082943)
*/
public class RecordJsonSerDeser188Test
extends DatabindTestUtil
{
record Animal(
@JsonDeserialize(using = PrefixStringDeserializer.class)
@JsonSerialize(using = PrefixStringSerializer.class)
String name,
Integer age
) { }
@SuppressWarnings("serial")
static class PrefixStringSerializer extends StdScalarSerializer<String> {
protected PrefixStringSerializer() {
super(String.class);
}
@Override
public void serialize(String value, JsonGenerator jgen, SerializerProvider provider)
throws IOException
{
jgen.writeString("custom " + value);
}
}
static class PrefixStringDeserializer extends StdScalarDeserializer<String>
{
private static final long serialVersionUID = 1L;
protected PrefixStringDeserializer() {
super(String.class);
}
@Override
public String deserialize(JsonParser jp, DeserializationContext ctxt)
throws IOException
{
return "custom-deser" + jp.getText();
}
}
private final ObjectMapper MAPPER = newJsonMapper();
@Test
void testJsonSerializeOnRecord()
throws Exception
{
Animal input = new Animal("dog", 3);
String JSON = MAPPER.writeValueAsString(input);
assertEquals(a2q("{'name':'custom dog','age':3}"), JSON);
}
@Test
void testJsonDeserializeOnRecord()
throws Exception
{
String JSON = a2q("{'name':'cat','age':4}");
Animal result = MAPPER.readValue(JSON, Animal.class);
assertEquals("custom-desercat", result.name());
assertEquals(4, result.age());
}
}