Skip to content

Commit 102abfb

Browse files
committed
Incremental work for #633, to suppress serialization of null type id, if possible (not possible with as-array wrapper)_
1 parent ae3f01b commit 102abfb

File tree

7 files changed

+115
-54
lines changed

7 files changed

+115
-54
lines changed

release-notes/VERSION

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ Project: jackson-databind
1818
#684: FAIL_ON_NUMBERS_FOR_ENUMS does not fail when integer value is quoted
1919
(reported by kllp@github)
2020
- Add a work-around in `ISO8601DateFormat` to allow omission of ':' from timezone
21+
- Bit more work to complete #633
2122

2223
2.5.0 (01-Jan-2015)
2324

src/main/java/com/fasterxml/jackson/databind/jsontype/impl/AsArrayTypeSerializer.java

Lines changed: 29 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,11 @@ public AsArrayTypeSerializer forProperty(BeanProperty prop) {
3535
@Override
3636
public void writeTypePrefixForObject(Object value, JsonGenerator jgen) throws IOException {
3737
final String typeId = idFromValue(value);
38+
// NOTE: can not always avoid writing type id, even if null
3839
if (jgen.canWriteTypeId()) {
39-
jgen.writeTypeId(typeId);
40+
if (typeId != null) {
41+
jgen.writeTypeId(typeId);
42+
}
4043
} else {
4144
jgen.writeStartArray();
4245
jgen.writeString(typeId);
@@ -47,8 +50,11 @@ public void writeTypePrefixForObject(Object value, JsonGenerator jgen) throws IO
4750
@Override
4851
public void writeTypePrefixForObject(Object value, JsonGenerator jgen, Class<?> type) throws IOException {
4952
final String typeId = idFromValueAndType(value, type);
53+
// NOTE: can not always avoid writing type id, even if null
5054
if (jgen.canWriteTypeId()) {
51-
jgen.writeTypeId(typeId);
55+
if (typeId != null) {
56+
jgen.writeTypeId(typeId);
57+
}
5258
} else {
5359
jgen.writeStartArray();
5460
jgen.writeString(typeId);
@@ -60,7 +66,9 @@ public void writeTypePrefixForObject(Object value, JsonGenerator jgen, Class<?>
6066
public void writeTypePrefixForArray(Object value, JsonGenerator jgen) throws IOException {
6167
final String typeId = idFromValue(value);
6268
if (jgen.canWriteTypeId()) {
63-
jgen.writeTypeId(typeId);
69+
if (typeId != null) {
70+
jgen.writeTypeId(typeId);
71+
}
6472
} else {
6573
jgen.writeStartArray();
6674
jgen.writeString(typeId);
@@ -72,7 +80,9 @@ public void writeTypePrefixForArray(Object value, JsonGenerator jgen) throws IOE
7280
public void writeTypePrefixForArray(Object value, JsonGenerator jgen, Class<?> type) throws IOException {
7381
final String typeId = idFromValueAndType(value, type);
7482
if (jgen.canWriteTypeId()) {
75-
jgen.writeTypeId(typeId);
83+
if (typeId != null) {
84+
jgen.writeTypeId(typeId);
85+
}
7686
} else {
7787
jgen.writeStartArray();
7888
jgen.writeString(typeId);
@@ -84,7 +94,9 @@ public void writeTypePrefixForArray(Object value, JsonGenerator jgen, Class<?> t
8494
public void writeTypePrefixForScalar(Object value, JsonGenerator jgen) throws IOException {
8595
final String typeId = idFromValue(value);
8696
if (jgen.canWriteTypeId()) {
87-
jgen.writeTypeId(typeId);
97+
if (typeId != null) {
98+
jgen.writeTypeId(typeId);
99+
}
88100
} else {
89101
// only need the wrapper array
90102
jgen.writeStartArray();
@@ -96,7 +108,9 @@ public void writeTypePrefixForScalar(Object value, JsonGenerator jgen) throws IO
96108
public void writeTypePrefixForScalar(Object value, JsonGenerator jgen, Class<?> type) throws IOException {
97109
final String typeId = idFromValueAndType(value, type);
98110
if (jgen.canWriteTypeId()) {
99-
jgen.writeTypeId(typeId);
111+
if (typeId != null) {
112+
jgen.writeTypeId(typeId);
113+
}
100114
} else {
101115
// only need the wrapper array
102116
jgen.writeStartArray();
@@ -144,7 +158,9 @@ public void writeTypeSuffixForScalar(Object value, JsonGenerator jgen) throws IO
144158
@Override
145159
public void writeCustomTypePrefixForObject(Object value, JsonGenerator jgen, String typeId) throws IOException {
146160
if (jgen.canWriteTypeId()) {
147-
jgen.writeTypeId(typeId);
161+
if (typeId != null) {
162+
jgen.writeTypeId(typeId);
163+
}
148164
} else {
149165
jgen.writeStartArray();
150166
jgen.writeString(typeId);
@@ -155,7 +171,9 @@ public void writeCustomTypePrefixForObject(Object value, JsonGenerator jgen, Str
155171
@Override
156172
public void writeCustomTypePrefixForArray(Object value, JsonGenerator jgen, String typeId) throws IOException {
157173
if (jgen.canWriteTypeId()) {
158-
jgen.writeTypeId(typeId);
174+
if (typeId != null) {
175+
jgen.writeTypeId(typeId);
176+
}
159177
} else {
160178
jgen.writeStartArray();
161179
jgen.writeString(typeId);
@@ -166,7 +184,9 @@ public void writeCustomTypePrefixForArray(Object value, JsonGenerator jgen, Stri
166184
@Override
167185
public void writeCustomTypePrefixForScalar(Object value, JsonGenerator jgen, String typeId) throws IOException {
168186
if (jgen.canWriteTypeId()) {
169-
jgen.writeTypeId(typeId);
187+
if (typeId != null) {
188+
jgen.writeTypeId(typeId);
189+
}
170190
} else {
171191
jgen.writeStartArray();
172192
jgen.writeString(typeId);

src/main/java/com/fasterxml/jackson/databind/jsontype/impl/AsExistingPropertyTypeSerializer.java

Lines changed: 6 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -35,35 +35,28 @@ public AsExistingPropertyTypeSerializer forProperty(BeanProperty prop) {
3535
public void writeTypePrefixForObject(Object value, JsonGenerator jgen) throws IOException
3636
{
3737
final String typeId = idFromValue(value);
38-
if (jgen.canWriteTypeId()) {
38+
if ((typeId != null) && jgen.canWriteTypeId()) {
3939
jgen.writeTypeId(typeId);
40-
jgen.writeStartObject();
41-
} else {
42-
jgen.writeStartObject();
4340
}
41+
jgen.writeStartObject();
4442
}
4543

4644
@Override
4745
public void writeTypePrefixForObject(Object value, JsonGenerator jgen, Class<?> type) throws IOException
4846
{
4947
final String typeId = idFromValueAndType(value, type);
50-
if (jgen.canWriteTypeId()) {
48+
if ((typeId != null) && jgen.canWriteTypeId()) {
5149
jgen.writeTypeId(typeId);
52-
jgen.writeStartObject();
53-
} else {
54-
jgen.writeStartObject();
5550
}
51+
jgen.writeStartObject();
5652
}
5753

5854
@Override
5955
public void writeCustomTypePrefixForObject(Object value, JsonGenerator jgen, String typeId) throws IOException
6056
{
61-
if (jgen.canWriteTypeId()) {
57+
if ((typeId != null) && jgen.canWriteTypeId()) {
6258
jgen.writeTypeId(typeId);
63-
jgen.writeStartObject();
64-
} else {
65-
jgen.writeStartObject();
6659
}
60+
jgen.writeStartObject();
6761
}
68-
6962
}

src/main/java/com/fasterxml/jackson/databind/jsontype/impl/AsExternalTypeSerializer.java

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -153,16 +153,22 @@ protected final void _writeArrayPrefix(Object value, JsonGenerator jgen) throws
153153
}
154154

155155
protected final void _writeScalarSuffix(Object value, JsonGenerator jgen, String typeId) throws IOException {
156-
jgen.writeStringField(_typePropertyName, typeId);
156+
if (typeId != null) {
157+
jgen.writeStringField(_typePropertyName, typeId);
158+
}
157159
}
158160

159161
protected final void _writeObjectSuffix(Object value, JsonGenerator jgen, String typeId) throws IOException {
160162
jgen.writeEndObject();
161-
jgen.writeStringField(_typePropertyName, typeId);
163+
if (typeId != null) {
164+
jgen.writeStringField(_typePropertyName, typeId);
165+
}
162166
}
163167

164168
protected final void _writeArraySuffix(Object value, JsonGenerator jgen, String typeId) throws IOException {
165169
jgen.writeEndArray();
166-
jgen.writeStringField(_typePropertyName, typeId);
170+
if (typeId != null) {
171+
jgen.writeStringField(_typePropertyName, typeId);
172+
}
167173
}
168174
}

src/main/java/com/fasterxml/jackson/databind/jsontype/impl/AsPropertyTypeSerializer.java

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,9 @@ public AsPropertyTypeSerializer forProperty(BeanProperty prop) {
4343
public void writeTypePrefixForObject(Object value, JsonGenerator jgen) throws IOException
4444
{
4545
final String typeId = idFromValue(value);
46-
if (jgen.canWriteTypeId()) {
46+
if (typeId == null) {
47+
jgen.writeStartObject();
48+
} else if (jgen.canWriteTypeId()) {
4749
jgen.writeTypeId(typeId);
4850
jgen.writeStartObject();
4951
} else {
@@ -56,7 +58,9 @@ public void writeTypePrefixForObject(Object value, JsonGenerator jgen) throws IO
5658
public void writeTypePrefixForObject(Object value, JsonGenerator jgen, Class<?> type) throws IOException
5759
{
5860
final String typeId = idFromValueAndType(value, type);
59-
if (jgen.canWriteTypeId()) {
61+
if (typeId == null) {
62+
jgen.writeStartObject();
63+
} else if (jgen.canWriteTypeId()) {
6064
jgen.writeTypeId(typeId);
6165
jgen.writeStartObject();
6266
} else {
@@ -91,7 +95,9 @@ public void writeTypeSuffixForObject(Object value, JsonGenerator jgen) throws IO
9195
@Override
9296
public void writeCustomTypePrefixForObject(Object value, JsonGenerator jgen, String typeId) throws IOException
9397
{
94-
if (jgen.canWriteTypeId()) {
98+
if (typeId == null) {
99+
jgen.writeStartObject();
100+
} else if (jgen.canWriteTypeId()) {
95101
jgen.writeTypeId(typeId);
96102
jgen.writeStartObject();
97103
} else {

src/main/java/com/fasterxml/jackson/databind/jsontype/impl/AsWrapperTypeSerializer.java

Lines changed: 60 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -33,45 +33,56 @@ public AsWrapperTypeSerializer forProperty(BeanProperty prop) {
3333
@Override
3434
public void writeTypePrefixForObject(Object value, JsonGenerator jgen) throws IOException
3535
{
36-
final String typeId = idFromValue(value);
36+
String typeId = idFromValue(value);
3737
if (jgen.canWriteTypeId()) {
38-
jgen.writeTypeId(typeId);
38+
if (typeId != null) {
39+
jgen.writeTypeId(typeId);
40+
}
3941
jgen.writeStartObject();
4042
} else {
4143
// wrapper
4244
jgen.writeStartObject();
4345
// and then JSON Object start caller wants
44-
jgen.writeObjectFieldStart(typeId);
46+
47+
// 28-Jan-2015, tatu: No really good answer here; can not really change
48+
// structure, so change null to empty String...
49+
jgen.writeObjectFieldStart(_validTypeId(typeId));
4550
}
4651
}
4752

4853
@Override
4954
public void writeTypePrefixForObject(Object value, JsonGenerator jgen, Class<?> type) throws IOException
5055
{
51-
final String typeId = idFromValueAndType(value, type);
56+
String typeId = idFromValueAndType(value, type);
5257
if (jgen.canWriteTypeId()) {
53-
jgen.writeTypeId(typeId);
58+
if (typeId != null) {
59+
jgen.writeTypeId(typeId);
60+
}
5461
jgen.writeStartObject();
5562
} else {
5663
// wrapper
5764
jgen.writeStartObject();
5865
// and then JSON Object start caller wants
59-
jgen.writeObjectFieldStart(typeId);
66+
67+
// 28-Jan-2015, tatu: No really good answer here; can not really change
68+
// structure, so change null to empty String...
69+
jgen.writeObjectFieldStart(_validTypeId(typeId));
6070
}
6171
}
6272

6373
@Override
6474
public void writeTypePrefixForArray(Object value, JsonGenerator jgen) throws IOException
6575
{
66-
final String typeId = idFromValue(value);
76+
String typeId = idFromValue(value);
6777
if (jgen.canWriteTypeId()) {
68-
jgen.writeTypeId(typeId);
69-
jgen.writeStartObject();
78+
if (typeId != null) {
79+
jgen.writeTypeId(typeId);
80+
}
81+
jgen.writeStartArray();
7082
} else {
7183
// can still wrap ok
7284
jgen.writeStartObject();
73-
// and then JSON Array start caller wants
74-
jgen.writeArrayFieldStart(typeId);
85+
jgen.writeArrayFieldStart(_validTypeId(typeId));
7586
}
7687
}
7788

@@ -80,25 +91,29 @@ public void writeTypePrefixForArray(Object value, JsonGenerator jgen, Class<?> t
8091
{
8192
final String typeId = idFromValueAndType(value, type);
8293
if (jgen.canWriteTypeId()) {
83-
jgen.writeTypeId(typeId);
84-
jgen.writeStartObject();
94+
if (typeId != null) {
95+
jgen.writeTypeId(typeId);
96+
}
97+
jgen.writeStartArray();
8598
} else {
8699
// can still wrap ok
87100
jgen.writeStartObject();
88101
// and then JSON Array start caller wants
89-
jgen.writeArrayFieldStart(typeId);
102+
jgen.writeArrayFieldStart(_validTypeId(typeId));
90103
}
91104
}
92105

93106
@Override
94107
public void writeTypePrefixForScalar(Object value, JsonGenerator jgen) throws IOException {
95108
final String typeId = idFromValue(value);
96109
if (jgen.canWriteTypeId()) {
97-
jgen.writeTypeId(typeId);
110+
if (typeId != null) {
111+
jgen.writeTypeId(typeId);
112+
}
98113
} else {
99114
// can still wrap ok
100115
jgen.writeStartObject();
101-
jgen.writeFieldName(typeId);
116+
jgen.writeFieldName(_validTypeId(typeId));
102117
}
103118
}
104119

@@ -107,11 +122,13 @@ public void writeTypePrefixForScalar(Object value, JsonGenerator jgen, Class<?>
107122
{
108123
final String typeId = idFromValueAndType(value, type);
109124
if (jgen.canWriteTypeId()) {
110-
jgen.writeTypeId(typeId);
125+
if (typeId != null) {
126+
jgen.writeTypeId(typeId);
127+
}
111128
} else {
112129
// can still wrap ok
113130
jgen.writeStartObject();
114-
jgen.writeFieldName(typeId);
131+
jgen.writeFieldName(_validTypeId(typeId));
115132
}
116133
}
117134

@@ -154,32 +171,38 @@ public void writeTypeSuffixForScalar(Object value, JsonGenerator jgen) throws IO
154171
@Override
155172
public void writeCustomTypePrefixForObject(Object value, JsonGenerator jgen, String typeId) throws IOException {
156173
if (jgen.canWriteTypeId()) {
157-
jgen.writeTypeId(typeId);
174+
if (typeId != null) {
175+
jgen.writeTypeId(typeId);
176+
}
158177
jgen.writeStartObject();
159178
} else {
160179
jgen.writeStartObject();
161-
jgen.writeObjectFieldStart(typeId);
180+
jgen.writeObjectFieldStart(_validTypeId(typeId));
162181
}
163182
}
164183

165184
@Override
166185
public void writeCustomTypePrefixForArray(Object value, JsonGenerator jgen, String typeId) throws IOException {
167186
if (jgen.canWriteTypeId()) {
168-
jgen.writeTypeId(typeId);
187+
if (typeId != null) {
188+
jgen.writeTypeId(typeId);
189+
}
169190
jgen.writeStartArray();
170191
} else {
171192
jgen.writeStartObject();
172-
jgen.writeArrayFieldStart(typeId);
193+
jgen.writeArrayFieldStart(_validTypeId(typeId));
173194
}
174195
}
175196

176197
@Override
177198
public void writeCustomTypePrefixForScalar(Object value, JsonGenerator jgen, String typeId) throws IOException {
178199
if (jgen.canWriteTypeId()) {
179-
jgen.writeTypeId(typeId);
200+
if (typeId != null) {
201+
jgen.writeTypeId(typeId);
202+
}
180203
} else {
181204
jgen.writeStartObject();
182-
jgen.writeFieldName(typeId);
205+
jgen.writeFieldName(_validTypeId(typeId));
183206
}
184207
}
185208

@@ -203,4 +226,17 @@ public void writeCustomTypeSuffixForScalar(Object value, JsonGenerator jgen, Str
203226
writeTypeSuffixForScalar(value, jgen); // standard impl works fine
204227
}
205228
}
229+
230+
/*
231+
/**********************************************************
232+
/* Internal helper methods
233+
/**********************************************************
234+
*/
235+
236+
/**
237+
* @since 2.6.0
238+
*/
239+
protected String _validTypeId(String typeId) {
240+
return (typeId == null) ? "" : typeId;
241+
}
206242
}

0 commit comments

Comments
 (0)