Skip to content

Commit

Permalink
Add RangeSerializer for @jsonformat String shape #118 (#128)
Browse files Browse the repository at this point in the history
  • Loading branch information
mukham12 authored Dec 12, 2023
1 parent 7f7e6b6 commit 9852b5a
Showing 1 changed file with 57 additions and 9 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import java.io.IOException;

import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.core.*;
import com.fasterxml.jackson.core.type.WritableTypeId;
import com.fasterxml.jackson.databind.*;
Expand All @@ -27,6 +28,8 @@ public class RangeSerializer extends StdSerializer<Range<?>>

protected final RangeHelper.RangeProperties _fieldNames;

protected final JsonFormat.Shape shape;

/*
/**********************************************************
/* Life-cycle
Expand All @@ -52,6 +55,17 @@ public RangeSerializer(JavaType type, JsonSerializer<?> endpointSer,
_rangeType = type;
_endpointSerializer = (JsonSerializer<Object>) endpointSer;
_fieldNames = fieldNames;
this.shape = JsonFormat.Shape.ANY;
}

public RangeSerializer(JavaType type, JsonSerializer<?> endpointSer,
RangeHelper.RangeProperties fieldNames, JsonFormat.Shape shape)
{
super(type);
_rangeType = type;
_endpointSerializer = (JsonSerializer<Object>) endpointSer;
_fieldNames = fieldNames;
this.shape = shape;
}

@Override
Expand All @@ -63,6 +77,9 @@ public boolean isEmpty(SerializerProvider prov, Range<?> value) {
public JsonSerializer<?> createContextual(SerializerProvider prov,
BeanProperty property) throws JsonMappingException
{
JsonFormat.Value format = findFormatOverrides(prov, property, handledType());
JsonFormat.Shape shape = format.getShape();

final PropertyNamingStrategy propertyNamingStrategy = prov.getConfig().getPropertyNamingStrategy();
final RangeHelper.RangeProperties nameMapping = RangeHelper.getPropertyNames(prov.getConfig(), propertyNamingStrategy);
JsonSerializer<?> endpointSer = _endpointSerializer;
Expand All @@ -72,7 +89,7 @@ public JsonSerializer<?> createContextual(SerializerProvider prov,
// let's not consider "untyped" (java.lang.Object) to be meaningful here...
if (endpointType != null && !endpointType.hasRawClass(Object.class)) {
JsonSerializer<?> ser = prov.findValueSerializer(endpointType, property);
return new RangeSerializer(_rangeType, ser, nameMapping);
return new RangeSerializer(_rangeType, ser, nameMapping, shape);
}
/* 21-Sep-2014, tatu: Need to make sure all serializers get proper contextual
* access, in case they rely on annotations on properties... (or, more generally,
Expand All @@ -82,7 +99,7 @@ public JsonSerializer<?> createContextual(SerializerProvider prov,
endpointSer = ((ContextualSerializer) endpointSer).createContextual(prov, property);
}
if ((endpointSer != _endpointSerializer) || (nameMapping != null)) {
return new RangeSerializer(_rangeType, endpointSer, nameMapping);
return new RangeSerializer(_rangeType, endpointSer, nameMapping, shape);
}
return this;
}
Expand All @@ -97,10 +114,33 @@ public JsonSerializer<?> createContextual(SerializerProvider prov,
public void serialize(Range<?> value, JsonGenerator gen, SerializerProvider provider)
throws IOException, JsonGenerationException
{
gen.writeStartObject(value);
_writeContents(value, gen, provider);
gen.writeEndObject();
if (shape == JsonFormat.Shape.STRING) {
gen.writeString(getStringFormat(value));
} else {
gen.writeStartObject(value);
_writeContents(value, gen, provider);
gen.writeEndObject();
}
}

private String getStringFormat(Range<?> range){
StringBuilder builder = new StringBuilder();

if (range.hasLowerBound()) {
builder.append(range.lowerBoundType() == BoundType.CLOSED ? '[' : '(').append(range.lowerEndpoint());
} else {
builder.append("(-∞");
}

builder.append("..");

if (range.hasUpperBound()) {
builder.append(range.upperEndpoint()).append(range.upperBoundType() == BoundType.CLOSED ? ']' : ')');
} else {
builder.append("+∞)");
}

return builder.toString();
}

@Override
Expand All @@ -109,10 +149,18 @@ public void serializeWithType(Range<?> value, JsonGenerator gen, SerializerProvi
throws IOException
{
gen.assignCurrentValue(value);
WritableTypeId typeIdDef = typeSer.writeTypePrefix(gen,
typeSer.typeId(value, JsonToken.START_OBJECT));
_writeContents(value, gen, provider);
typeSer.writeTypeSuffix(gen, typeIdDef);
if (shape == JsonFormat.Shape.STRING) {
String rangeString = getStringFormat(value);
WritableTypeId typeId = typeSer.writeTypeSuffix(gen,
typeSer.typeId(rangeString, JsonToken.VALUE_STRING)
);
typeSer.writeTypeSuffix(gen, typeId);
} else {
WritableTypeId typeIdDef = typeSer.writeTypePrefix(gen,
typeSer.typeId(value, JsonToken.START_OBJECT));
_writeContents(value, gen, provider);
typeSer.writeTypeSuffix(gen, typeIdDef);
}
}

private void _writeContents(Range<?> value, JsonGenerator g, SerializerProvider provider)
Expand Down

0 comments on commit 9852b5a

Please sign in to comment.