Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 8 additions & 8 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -45,23 +45,23 @@ public static class Pet {
```
And we instantiate the mapper either for JSON
```java
import com.fasterxml.jackson.databind.ObjectMapper;
import tools.jackson.databind.json.JsonMapper;

// ...

ObjectMapper mapper = new ObjectMapper();
mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
mapper.registerModule(new JsonNullableModule());
JsonMapper mapper = JsonMapper.builder().addModule(new JsonNullableModule())
.changeDefaultPropertyInclusion(incl -> incl.withValueInclusion(JsonInclude.Include.NON_NULL))
.build();
```
or for XML
```java
import com.fasterxml.jackson.dataformat.xml.XmlMapper;
import tools.jackson.dataformat.xml.XmlMapper;

// ...

XmlMapper xmlMapper = new XmlMapper();
xmlMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
xmlMapper.registerModule(new JsonNullableModule());
XmlMapper mapper = XmlMapper.builder().addModule(new JsonNullableModule())
.changeDefaultPropertyInclusion(incl -> incl.withValueInclusion(JsonInclude.Include.NON_NULL))
.build();
```
Then we can serialize
```java
Expand Down
10 changes: 7 additions & 3 deletions pom.xml
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.fasterxml.jackson</groupId>
<groupId>tools.jackson</groupId>
<artifactId>jackson-base</artifactId>
<version>2.20.0</version>
<version>3.0.0-rc10</version>
</parent>
<groupId>org.openapitools</groupId>
<artifactId>jackson-databind-nullable</artifactId>
Expand Down Expand Up @@ -74,9 +74,13 @@

<dependencies>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<groupId>tools.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
</dependency>
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
package org.openapitools.jackson.nullable;

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.PropertyName;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.ser.BeanPropertyWriter;
import com.fasterxml.jackson.databind.util.NameTransformer;
import tools.jackson.core.JsonGenerator;
import tools.jackson.databind.PropertyName;
import tools.jackson.databind.SerializationContext;
import tools.jackson.databind.ser.BeanPropertyWriter;
import tools.jackson.databind.util.NameTransformer;

public class JsonNullableBeanPropertyWriter extends BeanPropertyWriter
{
Expand All @@ -29,13 +29,13 @@ public BeanPropertyWriter unwrappingWriter(NameTransformer unwrapper) {
}

@Override
public void serializeAsField(Object bean, JsonGenerator jgen, SerializerProvider prov) throws Exception
public void serializeAsProperty(Object bean, JsonGenerator jgen, SerializationContext ctxt) throws Exception
{
Object value = get(bean);
if (JsonNullable.undefined().equals(value) || (_nullSerializer == null && value == null)) {
return;
}
super.serializeAsField(bean, jgen, prov);
super.serializeAsProperty(bean, jgen, ctxt);
}

}
Original file line number Diff line number Diff line change
@@ -1,18 +1,17 @@
package org.openapitools.jackson.nullable;


import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonToken;
import com.fasterxml.jackson.databind.DeserializationConfig;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JavaType;
import com.fasterxml.jackson.databind.JsonDeserializer;
import com.fasterxml.jackson.databind.deser.ValueInstantiator;
import com.fasterxml.jackson.databind.deser.std.ReferenceTypeDeserializer;
import com.fasterxml.jackson.databind.jsontype.TypeDeserializer;
import com.fasterxml.jackson.databind.type.ReferenceType;

import java.io.IOException;
import tools.jackson.core.JacksonException;
import tools.jackson.core.JsonParser;
import tools.jackson.core.JsonToken;
import tools.jackson.databind.DeserializationConfig;
import tools.jackson.databind.DeserializationContext;
import tools.jackson.databind.JavaType;
import tools.jackson.databind.ValueDeserializer;
import tools.jackson.databind.deser.ValueInstantiator;
import tools.jackson.databind.deser.std.ReferenceTypeDeserializer;
import tools.jackson.databind.jsontype.TypeDeserializer;
import tools.jackson.databind.type.ReferenceType;

public class JsonNullableDeserializer extends ReferenceTypeDeserializer<JsonNullable<Object>> {

Expand All @@ -26,7 +25,7 @@ public class JsonNullableDeserializer extends ReferenceTypeDeserializer<JsonNull
/**********************************************************
*/
public JsonNullableDeserializer(JavaType fullType, ValueInstantiator inst,
TypeDeserializer typeDeser, JsonDeserializer<?> deser) {
TypeDeserializer typeDeser, ValueDeserializer<?> deser) {
super(fullType, inst, typeDeser, deser);
if (fullType instanceof ReferenceType && ((ReferenceType) fullType).getReferencedType() != null) {
this.isStringDeserializer = ((ReferenceType) fullType).getReferencedType().isTypeOrSubTypeOf(String.class);
Expand All @@ -40,10 +39,10 @@ public JsonNullableDeserializer(JavaType fullType, ValueInstantiator inst,
*/

@Override
public JsonNullable<Object> deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
JsonToken t = p.getCurrentToken();
public JsonNullable<Object> deserialize(JsonParser p, DeserializationContext ctxt) throws JacksonException {
JsonToken t = p.currentToken();
if (t == JsonToken.VALUE_STRING && !isStringDeserializer) {
String str = p.getText().trim();
String str = p.getString().trim();
if (str.isEmpty()) {
return JsonNullable.undefined();
}
Expand All @@ -52,7 +51,7 @@ public JsonNullable<Object> deserialize(JsonParser p, DeserializationContext ctx
}

@Override
public JsonNullableDeserializer withResolved(TypeDeserializer typeDeser, JsonDeserializer<?> valueDeser) {
protected ReferenceTypeDeserializer<JsonNullable<Object>> withResolved(TypeDeserializer typeDeser, ValueDeserializer<?> valueDeser) {
return new JsonNullableDeserializer(_fullType, _valueInstantiator,
typeDeser, valueDeser);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,18 +1,23 @@
package org.openapitools.jackson.nullable;

import com.fasterxml.jackson.databind.BeanDescription;
import com.fasterxml.jackson.databind.DeserializationConfig;
import com.fasterxml.jackson.databind.JsonDeserializer;
import com.fasterxml.jackson.databind.deser.Deserializers;
import com.fasterxml.jackson.databind.jsontype.TypeDeserializer;
import com.fasterxml.jackson.databind.type.ReferenceType;
import tools.jackson.databind.DeserializationConfig;
import tools.jackson.databind.ValueDeserializer;
import tools.jackson.databind.BeanDescription.Supplier;
import tools.jackson.databind.deser.Deserializers;
import tools.jackson.databind.jsontype.TypeDeserializer;
import tools.jackson.databind.type.ReferenceType;

public class JsonNullableDeserializers extends Deserializers.Base {

@Override
public JsonDeserializer<?> findReferenceDeserializer(ReferenceType refType,
DeserializationConfig config, BeanDescription beanDesc,
TypeDeserializer contentTypeDeserializer, JsonDeserializer<?> contentDeserializer) {
public ValueDeserializer<?> findReferenceDeserializer(ReferenceType refType,
DeserializationConfig config, Supplier beanDescRef,
TypeDeserializer contentTypeDeserializer, ValueDeserializer<?> contentDeserializer) {
return (refType.hasRawClass(JsonNullable.class)) ? new JsonNullableDeserializer(refType, null, contentTypeDeserializer,contentDeserializer) : null;
}

@Override
public boolean hasDeserializerFor(DeserializationConfig config, Class<?> valueType) {
return JsonNullable.class.equals(valueType);
}
}
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
package org.openapitools.jackson.nullable;

import com.fasterxml.jackson.core.Version;
import com.fasterxml.jackson.core.json.PackageVersion;
import com.fasterxml.jackson.databind.Module;
import tools.jackson.core.Version;
import tools.jackson.core.json.PackageVersion;
import tools.jackson.databind.JacksonModule;

public class JsonNullableModule extends Module {
public class JsonNullableModule extends JacksonModule {

private final String NAME = "JsonNullableModule";

Expand All @@ -14,7 +14,7 @@ public void setupModule(SetupContext context) {
context.addDeserializers(new JsonNullableDeserializers());
// Modify type info for JsonNullable
context.addTypeModifier(new JsonNullableTypeModifier());
context.addBeanSerializerModifier(new JsonNullableBeanSerializerModifier());
context.addSerializerModifier(new JsonNullableValueSerializerModifier());
}

@Override
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
package org.openapitools.jackson.nullable;

import com.fasterxml.jackson.databind.BeanProperty;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.jsontype.TypeSerializer;
import com.fasterxml.jackson.databind.ser.std.ReferenceTypeSerializer;
import com.fasterxml.jackson.databind.type.ReferenceType;
import com.fasterxml.jackson.databind.util.NameTransformer;
import tools.jackson.databind.BeanProperty;
import tools.jackson.databind.ValueSerializer;
import tools.jackson.databind.jsontype.TypeSerializer;
import tools.jackson.databind.ser.std.ReferenceTypeSerializer;
import tools.jackson.databind.type.ReferenceType;
import tools.jackson.databind.util.NameTransformer;

public class JsonNullableSerializer extends ReferenceTypeSerializer<JsonNullable<?>> {

Expand All @@ -18,12 +18,12 @@ public class JsonNullableSerializer extends ReferenceTypeSerializer<JsonNullable
*/

protected JsonNullableSerializer(ReferenceType fullType, boolean staticTyping,
TypeSerializer vts, JsonSerializer<Object> ser) {
TypeSerializer vts, ValueSerializer<Object> ser) {
super(fullType, staticTyping, vts, ser);
}

protected JsonNullableSerializer(JsonNullableSerializer base, BeanProperty property,
TypeSerializer vts, JsonSerializer<?> valueSer, NameTransformer unwrapper,
TypeSerializer vts, ValueSerializer<?> valueSer, NameTransformer unwrapper,
Object suppressableValue)
{
// Keep suppressNulls to false to always serialize JsonNullable[null]
Expand All @@ -33,7 +33,7 @@ protected JsonNullableSerializer(JsonNullableSerializer base, BeanProperty prope

@Override
protected ReferenceTypeSerializer<JsonNullable<?>> withResolved(BeanProperty prop,
TypeSerializer vts, JsonSerializer<?> valueSer,
TypeSerializer vts, ValueSerializer<?> valueSer,
NameTransformer unwrapper)
{
return new JsonNullableSerializer(this, prop, vts, valueSer, unwrapper,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,19 +1,21 @@
package org.openapitools.jackson.nullable;

import com.fasterxml.jackson.databind.BeanDescription;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.MapperFeature;
import com.fasterxml.jackson.databind.SerializationConfig;
import com.fasterxml.jackson.databind.jsontype.TypeSerializer;
import com.fasterxml.jackson.databind.ser.Serializers;
import com.fasterxml.jackson.databind.type.ReferenceType;

public class JsonNullableSerializers extends Serializers.Base {
import com.fasterxml.jackson.annotation.JsonFormat.Value;

import tools.jackson.databind.MapperFeature;
import tools.jackson.databind.SerializationConfig;
import tools.jackson.databind.ValueSerializer;
import tools.jackson.databind.BeanDescription.Supplier;
import tools.jackson.databind.jsontype.TypeSerializer;
import tools.jackson.databind.ser.Serializers;
import tools.jackson.databind.type.ReferenceType;

public class JsonNullableSerializers extends Serializers.Base {
@Override
public JsonSerializer<?> findReferenceSerializer(SerializationConfig config,
ReferenceType refType, BeanDescription beanDesc,
TypeSerializer contentTypeSerializer, JsonSerializer<Object> contentValueSerializer) {
public ValueSerializer<?> findReferenceSerializer(SerializationConfig config,
ReferenceType refType, Supplier beanDescRef, Value formatOverrides,
TypeSerializer contentTypeSerializer, ValueSerializer<Object> contentValueSerializer) {
if (JsonNullable.class.isAssignableFrom(refType.getRawClass())) {
boolean staticTyping = (contentTypeSerializer == null)
&& config.isEnabled(MapperFeature.USE_STATIC_TYPING);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
package org.openapitools.jackson.nullable;

import com.fasterxml.jackson.databind.JavaType;
import com.fasterxml.jackson.databind.type.ReferenceType;
import com.fasterxml.jackson.databind.type.TypeBindings;
import com.fasterxml.jackson.databind.type.TypeFactory;
import com.fasterxml.jackson.databind.type.TypeModifier;
import tools.jackson.databind.JavaType;
import tools.jackson.databind.type.ReferenceType;
import tools.jackson.databind.type.TypeBindings;
import tools.jackson.databind.type.TypeFactory;
import tools.jackson.databind.type.TypeModifier;

import java.lang.reflect.Type;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,18 +1,18 @@
package org.openapitools.jackson.nullable;

import com.fasterxml.jackson.databind.BeanDescription;
import com.fasterxml.jackson.databind.JavaType;
import com.fasterxml.jackson.databind.SerializationConfig;
import com.fasterxml.jackson.databind.ser.BeanPropertyWriter;
import com.fasterxml.jackson.databind.ser.BeanSerializerModifier;
import tools.jackson.databind.JavaType;
import tools.jackson.databind.SerializationConfig;
import tools.jackson.databind.BeanDescription.Supplier;
import tools.jackson.databind.ser.BeanPropertyWriter;
import tools.jackson.databind.ser.ValueSerializerModifier;

import java.util.List;

public class JsonNullableBeanSerializerModifier extends BeanSerializerModifier
public class JsonNullableValueSerializerModifier extends ValueSerializerModifier
{
@Override
public List<BeanPropertyWriter> changeProperties(SerializationConfig config,
BeanDescription beanDesc,
Supplier beanDesc,
List<BeanPropertyWriter> beanProperties)
{
for (int i = 0; i < beanProperties.size(); ++i) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
package @package@;

import com.fasterxml.jackson.core.Version;
import com.fasterxml.jackson.core.Versioned;
import com.fasterxml.jackson.core.util.VersionUtil;
import tools.jackson.core.Version;
import tools.jackson.core.Versioned;
import tools.jackson.core.util.VersionUtil;

/**
* Automatically generated from PackageVersion.java.in during
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
package org.openapitools.jackson.nullable;

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.io.SerializedString;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.ser.BeanPropertyWriter;
import com.fasterxml.jackson.databind.ser.impl.UnwrappingBeanPropertyWriter;
import com.fasterxml.jackson.databind.util.NameTransformer;
import tools.jackson.core.JsonGenerator;
import tools.jackson.core.io.SerializedString;
import tools.jackson.databind.SerializationContext;
import tools.jackson.databind.ser.BeanPropertyWriter;
import tools.jackson.databind.ser.bean.UnwrappingBeanPropertyWriter;
import tools.jackson.databind.util.NameTransformer;

public class UnwrappingJsonNullableBeanPropertyWriter extends UnwrappingBeanPropertyWriter
{
Expand All @@ -28,12 +28,12 @@ protected UnwrappingBeanPropertyWriter _new(NameTransformer transformer, Seriali
}

@Override
public void serializeAsField(Object bean, JsonGenerator gen, SerializerProvider prov) throws Exception
public void serializeAsProperty(Object bean, JsonGenerator gen, SerializationContext prov) throws Exception
{
Object value = get(bean);
if (JsonNullable.undefined().equals(value) || (_nullSerializer == null && value == null)) {
return;
}
super.serializeAsField(bean, gen, prov);
super.serializeAsProperty(bean, gen, prov);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonPropertyOrder;
import com.fasterxml.jackson.databind.ObjectMapper;
import tools.jackson.databind.ObjectMapper;
import org.junit.jupiter.api.Test;

import java.text.SimpleDateFormat;
Expand Down Expand Up @@ -33,12 +33,13 @@ static class ContextualJsonNullables
*/

@Test
void testContextualJsonNullables() throws Exception
void testContextualJsonNullables()
{
final ObjectMapper mapper = mapperWithModule();
SimpleDateFormat df = new SimpleDateFormat("yyyy/MM/dd");
df.setTimeZone(TimeZone.getTimeZone("UTC"));
mapper.setDateFormat(df);

final ObjectMapper mapper = mapperBuilderWithModule().defaultDateFormat(df).build();

ContextualJsonNullables input = new ContextualJsonNullables();
input.date = JsonNullable.of(new Date(0L));
input.date1 = JsonNullable.of(new Date(0L));
Expand Down
Loading