Skip to content

Commit 6172d75

Browse files
committed
Fix #849
1 parent 19b897c commit 6172d75

File tree

3 files changed

+100
-25
lines changed

3 files changed

+100
-25
lines changed

release-notes/VERSION

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@ Project: jackson-databind
7878
(contributed by Steve G, thezerobit@github)
7979
#840: Change semantics of `@JsonPropertyOrder(alphabetic)` to only count `true` value
8080
#848: Custom serializer not used if POJO has `@JsonValue`
81+
#849: Possible problem with `NON_EMPTY` exclusion, `int`s, `Strings`
8182
- Remove old cglib compatibility tests; cause problems in Eclipse
8283

8384
2.5.5 (not released)

src/main/java/com/fasterxml/jackson/databind/ser/std/NumberSerializers.java

Lines changed: 51 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,8 @@ public static void addAll(Map<String, JsonSerializer<?>> allDeserializers)
5151
protected abstract static class Base<T> extends StdScalarSerializer<T>
5252
implements ContextualSerializer
5353
{
54+
protected final static Integer EMPTY_INTEGER = Integer.valueOf(0);
55+
5456
protected final JsonParser.NumberType _numberType;
5557
protected final String _schemaType;
5658
protected final boolean _isInt;
@@ -116,16 +118,22 @@ public JsonSerializer<?> createContextual(SerializerProvider prov,
116118
@JacksonStdImpl
117119
public final static class ShortSerializer extends Base<Short>
118120
{
121+
private final static Short EMPTY = (short) 0;
119122
final static ShortSerializer instance = new ShortSerializer();
120-
123+
121124
public ShortSerializer() { super(Short.class, JsonParser.NumberType.INT, "number"); }
122125

126+
@Override
127+
public boolean isEmpty(SerializerProvider prov, Short value) {
128+
return EMPTY.equals(value);
129+
}
130+
123131
@Override
124132
public void serialize(Short value, JsonGenerator gen, SerializerProvider provider) throws IOException {
125133
gen.writeNumber(value.shortValue());
126134
}
127135
}
128-
136+
129137
/**
130138
* This is the special serializer for regular {@link java.lang.Integer}s
131139
* (and primitive ints)
@@ -153,6 +161,11 @@ public void serializeWithType(Object value, JsonGenerator gen,
153161
// no type info, just regular serialization
154162
serialize(value, gen, provider);
155163
}
164+
165+
@Override
166+
public boolean isEmpty(SerializerProvider prov, Object value) {
167+
return EMPTY_INTEGER.equals(value);
168+
}
156169
}
157170

158171
/**
@@ -164,11 +177,16 @@ public void serializeWithType(Object value, JsonGenerator gen,
164177
public final static class IntLikeSerializer extends Base<Number>
165178
{
166179
final static IntLikeSerializer instance = new IntLikeSerializer();
167-
180+
168181
public IntLikeSerializer() {
169182
super(Number.class, JsonParser.NumberType.INT, "integer");
170183
}
171-
184+
185+
@Override
186+
public boolean isEmpty(SerializerProvider prov, Number value) {
187+
return value.intValue() == 0;
188+
}
189+
172190
@Override
173191
public void serialize(Number value, JsonGenerator gen, SerializerProvider provider) throws IOException {
174192
gen.writeNumber(value.intValue());
@@ -178,26 +196,40 @@ public void serialize(Number value, JsonGenerator gen, SerializerProvider provid
178196
@JacksonStdImpl
179197
public final static class LongSerializer extends Base<Object>
180198
{
199+
private final static Long EMPTY = 0L;
200+
181201
final static LongSerializer instance = new LongSerializer();
182202

183203
public LongSerializer() { super(Long.class, JsonParser.NumberType.LONG, "number"); }
184-
204+
205+
@Override
206+
public boolean isEmpty(SerializerProvider prov, Object value) {
207+
return EMPTY.equals(value);
208+
}
209+
185210
@Override
186211
public void serialize(Object value, JsonGenerator gen, SerializerProvider provider) throws IOException {
187212
gen.writeNumber(((Long) value).longValue());
188213
}
189214
}
190-
215+
191216
@JacksonStdImpl
192-
public final static class FloatSerializer extends Base<Float>
217+
public final static class FloatSerializer extends Base<Object>
193218
{
219+
private final static Float EMPTY = 0f;
220+
194221
final static FloatSerializer instance = new FloatSerializer();
195-
222+
196223
public FloatSerializer() { super(Float.class, JsonParser.NumberType.FLOAT, "number"); }
197-
224+
198225
@Override
199-
public void serialize(Float value, JsonGenerator gen, SerializerProvider provider) throws IOException {
200-
gen.writeNumber(value.floatValue());
226+
public boolean isEmpty(SerializerProvider prov, Object value) {
227+
return EMPTY.equals(value);
228+
}
229+
230+
@Override
231+
public void serialize(Object value, JsonGenerator gen, SerializerProvider provider) throws IOException {
232+
gen.writeNumber(((Float) value).floatValue());
201233
}
202234
}
203235

@@ -211,10 +243,17 @@ public void serialize(Float value, JsonGenerator gen, SerializerProvider provide
211243
@JacksonStdImpl
212244
public final static class DoubleSerializer extends Base<Object>
213245
{
246+
private final static Double EMPTY = 0d;
247+
214248
final static DoubleSerializer instance = new DoubleSerializer();
215249

216250
public DoubleSerializer() { super(Double.class, JsonParser.NumberType.DOUBLE, "number"); }
217-
251+
252+
@Override
253+
public boolean isEmpty(SerializerProvider prov, Object value) {
254+
return EMPTY.equals(value);
255+
}
256+
218257
@Override
219258
public void serialize(Object value, JsonGenerator gen, SerializerProvider provider) throws IOException {
220259
gen.writeNumber(((Double) value).doubleValue());

src/test/java/com/fasterxml/jackson/databind/ser/TestJsonSerialize2.java

Lines changed: 48 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,6 @@
1515
public class TestJsonSerialize2
1616
extends BaseMapTest
1717
{
18-
// [JACKSON-480]
19-
2018
static class SimpleKey {
2119
protected final String key;
2220

@@ -107,6 +105,27 @@ public MapWrapperWithSerializer(String key, String value) {
107105
}
108106
}
109107

108+
static class NonEmptyString {
109+
@JsonInclude(JsonInclude.Include.NON_EMPTY)
110+
public String value;
111+
112+
public NonEmptyString(String v) { value = v; }
113+
}
114+
115+
static class NonEmptyInt {
116+
@JsonInclude(JsonInclude.Include.NON_EMPTY)
117+
public int value;
118+
119+
public NonEmptyInt(int v) { value = v; }
120+
}
121+
122+
static class NonEmptyDouble {
123+
@JsonInclude(JsonInclude.Include.NON_EMPTY)
124+
public double value;
125+
126+
public NonEmptyDouble(double v) { value = v; }
127+
}
128+
110129
static class NullBean
111130
{
112131
@JsonSerialize(using=NullSerializer.class)
@@ -146,22 +165,19 @@ public void testSerializedAsListWithClassSerializer() throws IOException
146165
assertEquals("[\"value foo\"]", m.writeValueAsString(list));
147166
}
148167

149-
// [JACKSON-480], test annotations when applied to List property (getter, setter)
150168
public void testSerializedAsListWithPropertyAnnotations() throws IOException
151169
{
152170
ListWrapperSimple input = new ListWrapperSimple("bar");
153171
assertEquals("{\"values\":[{\"value\":\"bar\"}]}", MAPPER.writeValueAsString(input));
154172
}
155173

156-
// [JACKSON-480], test Serialization annotation with Map
157174
public void testSerializedAsMapWithClassSerializer() throws IOException
158175
{
159176
SimpleValueMapWithSerializer map = new SimpleValueMapWithSerializer();
160177
map.put(new SimpleKey("abc"), new ActualValue("123"));
161178
assertEquals("{\"key abc\":\"value 123\"}", MAPPER.writeValueAsString(map));
162179
}
163180

164-
// [JACKSON-480], test annotations when applied to Map property (getter, setter)
165181
public void testSerializedAsMapWithPropertyAnnotations() throws IOException
166182
{
167183
MapWrapperSimple input = new MapWrapperSimple("a", "b");
@@ -181,17 +197,11 @@ public void testSerializedAsMapWithPropertyAnnotations2() throws IOException
181197
assertEquals("{\"values\":{\"key foo\":\"value b\"}}", MAPPER.writeValueAsString(input));
182198
}
183199

184-
// [JACKSON-602]: Include.NON_EMPTY
185-
public void testEmptyInclusion() throws IOException
200+
public void testEmptyInclusionContainers() throws IOException
186201
{
187202
ObjectMapper defMapper = MAPPER;
188203
ObjectMapper inclMapper = new ObjectMapper().setSerializationInclusion(JsonInclude.Include.NON_EMPTY);
189204

190-
StringWrapper str = new StringWrapper("");
191-
assertEquals("{\"str\":\"\"}", defMapper.writeValueAsString(str));
192-
assertEquals("{}", inclMapper.writeValueAsString(str));
193-
assertEquals("{}", inclMapper.writeValueAsString(new StringWrapper()));
194-
195205
ListWrapper<String> list = new ListWrapper<String>();
196206
assertEquals("{\"list\":[]}", defMapper.writeValueAsString(list));
197207
assertEquals("{}", inclMapper.writeValueAsString(list));
@@ -208,7 +218,32 @@ public void testEmptyInclusion() throws IOException
208218
assertEquals("{}", inclMapper.writeValueAsString(new ArrayWrapper<Integer>(null)));
209219
}
210220

211-
// [JACKSON-699]
221+
public void testEmptyInclusionScalars() throws IOException
222+
{
223+
ObjectMapper defMapper = MAPPER;
224+
ObjectMapper inclMapper = new ObjectMapper().setSerializationInclusion(JsonInclude.Include.NON_EMPTY);
225+
226+
// First, Strings
227+
StringWrapper str = new StringWrapper("");
228+
assertEquals("{\"str\":\"\"}", defMapper.writeValueAsString(str));
229+
assertEquals("{}", inclMapper.writeValueAsString(str));
230+
assertEquals("{}", inclMapper.writeValueAsString(new StringWrapper()));
231+
232+
assertEquals("{\"value\":\"x\"}", defMapper.writeValueAsString(new NonEmptyString("x")));
233+
assertEquals("{}", defMapper.writeValueAsString(new NonEmptyString("")));
234+
235+
// Then numbers
236+
assertEquals("{\"value\":12}", defMapper.writeValueAsString(new NonEmptyInt(12)));
237+
assertEquals("{}", defMapper.writeValueAsString(new NonEmptyInt(0)));
238+
239+
assertEquals("{\"value\":1.25}", defMapper.writeValueAsString(new NonEmptyDouble(1.25)));
240+
assertEquals("{}", defMapper.writeValueAsString(new NonEmptyDouble(0.0)));
241+
242+
IntWrapper zero = new IntWrapper(0);
243+
assertEquals("{\"i\":0}", defMapper.writeValueAsString(zero));
244+
assertEquals("{}", inclMapper.writeValueAsString(zero));
245+
}
246+
212247
public void testNullSerializer() throws Exception
213248
{
214249
String json = MAPPER.writeValueAsString(new NullBean());

0 commit comments

Comments
 (0)