Skip to content

Commit ca1867e

Browse files
committed
Fix #2475
1 parent 54aa38d commit ca1867e

20 files changed

+115
-54
lines changed

release-notes/CREDITS-2.x

+5
Original file line numberDiff line numberDiff line change
@@ -975,3 +975,8 @@ Martín Coll (colltoaction@github)
975975
Andrey Kulikov (ankulikov@github)
976976
* Reported #2457: Extended enum values are not handled as enums when used as Map keys
977977
(2.10.1)
978+
979+
Ryan Bohn (bohnman@github)
980+
* Reported `StringCollectionSerializer` calls `JsonGenerator.setCurrentValue(value)`,
981+
which messes up current value for sibling properties
982+
(2.10.1)

release-notes/VERSION-2.x

+3
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,9 @@ Project: jackson-databind
88

99
#2457: Extended enum values are not handled as enums when used as Map keys
1010
(reported by Andrey K)
11+
#2475: `StringCollectionSerializer` calls `JsonGenerator.setCurrentValue(value)`,
12+
which messes up current value for sibling properties
13+
(reported by Ryan B)
1114

1215
2.10.0 (26-Sep-2019)
1316

src/main/java/com/fasterxml/jackson/databind/deser/std/FromStringDeserializer.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
* can be coerced into text, like Numbers and Booleans).
2525
* Simple JSON String values are trimmed using {@link java.lang.String#trim}.
2626
* Partial deserializer implementation will try to first access current token as
27-
* a String, calls {@link #_deserialize(String,DeserializationContext)} and
27+
* a String, calls {@code _deserialize(String,DeserializationContext)} and
2828
* returns return value.
2929
* If this does not work (current token not a simple scalar type), attempts
3030
* are made so that:

src/main/java/com/fasterxml/jackson/databind/node/ArrayNode.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -173,7 +173,7 @@ public void serialize(JsonGenerator f, SerializerProvider provider) throws IOExc
173173
{
174174
final List<JsonNode> c = _children;
175175
final int size = c.size();
176-
f.writeStartArray(size);
176+
f.writeStartArray(this, size);
177177
for (int i = 0; i < size; ++i) { // we'll typically have array list
178178
// For now, assuming it's either BaseJsonNode, JsonSerializable
179179
JsonNode n = c.get(i);

src/main/java/com/fasterxml/jackson/databind/ser/impl/BeanAsArraySerializer.java

+2-4
Original file line numberDiff line numberDiff line change
@@ -136,9 +136,9 @@ public void serializeWithType(Object bean, JsonGenerator gen,
136136
_serializeWithObjectId(bean, gen, provider, typeSer);
137137
return;
138138
}
139-
gen.setCurrentValue(bean);
140139
WritableTypeId typeIdDef = _typeIdDef(typeSer, bean, JsonToken.START_ARRAY);
141140
typeSer.writeTypePrefix(gen, typeIdDef);
141+
gen.setCurrentValue(bean);
142142
serializeAsArray(bean, gen, provider);
143143
typeSer.writeTypeSuffix(gen, typeIdDef);
144144
}
@@ -161,9 +161,7 @@ && hasSingleElement(provider)) {
161161
* any getter, filtering) have already been checked; so code here
162162
* is trivial.
163163
*/
164-
gen.writeStartArray();
165-
// [databind#631]: Assign current value, to be accessible by custom serializers
166-
gen.setCurrentValue(bean);
164+
gen.writeStartArray(bean);
167165
serializeAsArray(bean, gen, provider);
168166
gen.writeEndArray();
169167
}

src/main/java/com/fasterxml/jackson/databind/ser/impl/IndexedListSerializer.java

+1-2
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ public final void serialize(List<?> value, JsonGenerator gen, SerializerProvider
7575
return;
7676
}
7777
}
78-
gen.writeStartArray(len);
78+
gen.writeStartArray(value, len);
7979
serializeContents(value, gen, provider);
8080
gen.writeEndArray();
8181
}
@@ -182,7 +182,6 @@ public void serializeTypedContents(List<?> value, JsonGenerator jgen, Serializer
182182
}
183183
}
184184
} catch (Exception e) {
185-
// [JACKSON-55] Need to add reference information
186185
wrapAndThrow(provider, e, value, i);
187186
}
188187
}

src/main/java/com/fasterxml/jackson/databind/ser/impl/IndexedStringListSerializer.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ public void serialize(List<String> value, JsonGenerator g,
7373
return;
7474
}
7575
}
76-
g.writeStartArray(len);
76+
g.writeStartArray(value, len);
7777
serializeContents(value, g, provider, len);
7878
g.writeEndArray();
7979
}
@@ -85,14 +85,14 @@ public void serializeWithType(List<String> value, JsonGenerator g, SerializerPro
8585
{
8686
WritableTypeId typeIdDef = typeSer.writeTypePrefix(g,
8787
typeSer.typeId(value, JsonToken.START_ARRAY));
88+
g.setCurrentValue(value);
8889
serializeContents(value, g, provider, value.size());
8990
typeSer.writeTypeSuffix(g, typeIdDef);
9091
}
9192

9293
private final void serializeContents(List<String> value, JsonGenerator g,
9394
SerializerProvider provider, int len) throws IOException
9495
{
95-
g.setCurrentValue(value);
9696
int i = 0;
9797
try {
9898
for (; i < len; ++i) {

src/main/java/com/fasterxml/jackson/databind/ser/impl/IteratorSerializer.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ public final void serialize(Iterator<?> value, JsonGenerator gen,
6363
}
6464
}
6565
*/
66-
gen.writeStartArray();
66+
gen.writeStartArray(value);
6767
serializeContents(value, gen, provider);
6868
gen.writeEndArray();
6969
}

src/main/java/com/fasterxml/jackson/databind/ser/impl/StringArraySerializer.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -167,7 +167,7 @@ public final void serialize(String[] value, JsonGenerator gen, SerializerProvide
167167
return;
168168
}
169169
}
170-
gen.writeStartArray(len);
170+
gen.writeStartArray(value, len);
171171
serializeContents(value, gen, provider);
172172
gen.writeEndArray();
173173
}

src/main/java/com/fasterxml/jackson/databind/ser/impl/StringCollectionSerializer.java

+2-3
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,6 @@ protected void acceptContentVisitor(JsonArrayFormatVisitor visitor) throws JsonM
6767
public void serialize(Collection<String> value, JsonGenerator g,
6868
SerializerProvider provider) throws IOException
6969
{
70-
g.setCurrentValue(value);
7170
final int len = value.size();
7271
if (len == 1) {
7372
if (((_unwrapSingle == null) &&
@@ -77,7 +76,7 @@ public void serialize(Collection<String> value, JsonGenerator g,
7776
return;
7877
}
7978
}
80-
g.writeStartArray(len);
79+
g.writeStartArray(value, len);
8180
serializeContents(value, g, provider);
8281
g.writeEndArray();
8382
}
@@ -87,9 +86,9 @@ public void serializeWithType(Collection<String> value, JsonGenerator g,
8786
SerializerProvider provider, TypeSerializer typeSer)
8887
throws IOException
8988
{
90-
g.setCurrentValue(value);
9189
WritableTypeId typeIdDef = typeSer.writeTypePrefix(g,
9290
typeSer.typeId(value, JsonToken.START_ARRAY));
91+
g.setCurrentValue(value);
9392
serializeContents(value, g, provider);
9493
typeSer.writeTypeSuffix(g, typeIdDef);
9594
}

src/main/java/com/fasterxml/jackson/databind/ser/impl/UnknownSerializer.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ public void serialize(Object value, JsonGenerator gen, SerializerProvider provid
3333
failForEmpty(provider, value);
3434
}
3535
// But if it's fine, we'll just output empty JSON Object:
36-
gen.writeStartObject();
36+
gen.writeStartObject(value, 0);
3737
gen.writeEndObject();
3838
}
3939

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

+3-5
Original file line numberDiff line numberDiff line change
@@ -118,9 +118,7 @@ public void serialize(T value, JsonGenerator gen, SerializerProvider provider) t
118118
return;
119119
}
120120
}
121-
gen.setCurrentValue(value);
122-
gen.writeStartArray();
123-
// [databind#631]: Assign current value, to be accessible by custom serializers
121+
gen.writeStartArray(value);
124122
serializeContents(value, gen, provider);
125123
gen.writeEndArray();
126124
}
@@ -130,10 +128,10 @@ public final void serializeWithType(T value, JsonGenerator g, SerializerProvider
130128
TypeSerializer typeSer)
131129
throws IOException
132130
{
133-
// [databind#631]: Assign current value, to be accessible by custom serializers
134-
g.setCurrentValue(value);
135131
WritableTypeId typeIdDef = typeSer.writeTypePrefix(g,
136132
typeSer.typeId(value, JsonToken.START_ARRAY));
133+
// [databind#631]: Assign current value, to be accessible by custom serializers
134+
g.setCurrentValue(value);
137135
serializeContents(value, g, provider);
138136
typeSer.writeTypeSuffix(g, typeIdDef);
139137
}

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

+3-5
Original file line numberDiff line numberDiff line change
@@ -244,9 +244,7 @@ && hasSingleElement(value)) {
244244
serializeContents(value, gen, provider);
245245
return;
246246
}
247-
gen.writeStartArray();
248-
// [databind#631]: Assign current value, to be accessible by custom serializers
249-
gen.setCurrentValue(value);
247+
gen.writeStartArray(value);
250248
serializeContents(value, gen, provider);
251249
gen.writeEndArray();
252250
}
@@ -255,10 +253,10 @@ && hasSingleElement(value)) {
255253
public void serializeWithType(T value, JsonGenerator g, SerializerProvider provider,
256254
TypeSerializer typeSer) throws IOException
257255
{
258-
// [databind#631]: Assign current value, to be accessible by custom serializers
259-
g.setCurrentValue(value);
260256
WritableTypeId typeIdDef = typeSer.writeTypePrefix(g,
261257
typeSer.typeId(value, JsonToken.START_ARRAY));
258+
// [databind#631]: Assign current value, to be accessible by custom serializers
259+
g.setCurrentValue(value);
262260
serializeContents(value, g, provider);
263261
typeSer.writeTypeSuffix(g, typeIdDef);
264262
}

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ public final void serialize(Collection<?> value, JsonGenerator g, SerializerProv
103103
return;
104104
}
105105
}
106-
g.writeStartArray(len);
106+
g.writeStartArray(value, len);
107107
serializeContents(value, g, provider);
108108
g.writeEndArray();
109109
}

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

+3-4
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ public final void serialize(EnumSet<? extends Enum<?>> value, JsonGenerator gen,
6060
return;
6161
}
6262
}
63-
gen.writeStartArray(len);
63+
gen.writeStartArray(value, len);
6464
serializeContents(value, gen, provider);
6565
gen.writeEndArray();
6666
}
@@ -77,9 +77,8 @@ public void serializeContents(EnumSet<? extends Enum<?>> value, JsonGenerator ge
7777
*/
7878
for (Enum<?> en : value) {
7979
if (enumSer == null) {
80-
/* 12-Jan-2010, tatu: Since enums cannot be polymorphic, let's
81-
* not bother with typed serializer variant here
82-
*/
80+
// 12-Jan-2010, tatu: Since enums cannot be polymorphic, let's
81+
// not bother with typed serializer variant here
8382
enumSer = provider.findValueSerializer(en.getDeclaringClass(), _property);
8483
}
8584
enumSer.serialize(en, gen, provider);

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ public final void serialize(Iterable<?> value, JsonGenerator gen,
7070
return;
7171
}
7272
}
73-
gen.writeStartArray();
73+
gen.writeStartArray(value);
7474
serializeContents(value, gen, provider);
7575
gen.writeEndArray();
7676
}

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -209,7 +209,7 @@ public final void serialize(Object[] value, JsonGenerator gen, SerializerProvide
209209
return;
210210
}
211211
}
212-
gen.writeStartArray(len);
212+
gen.writeStartArray(value, len);
213213
serializeContents(value, gen, provider);
214214
gen.writeEndArray();
215215
}

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

+4-11
Original file line numberDiff line numberDiff line change
@@ -141,8 +141,7 @@ public final void serialize(boolean[] value, JsonGenerator g, SerializerProvider
141141
serializeContents(value, g, provider);
142142
return;
143143
}
144-
g.writeStartArray(len);
145-
g.setCurrentValue(value);
144+
g.writeStartArray(value, len);
146145
serializeContents(value, g, provider);
147146
g.writeEndArray();
148147
}
@@ -219,8 +218,7 @@ public final void serialize(short[] value, JsonGenerator g, SerializerProvider p
219218
serializeContents(value, g, provider);
220219
return;
221220
}
222-
g.writeStartArray(len);
223-
g.setCurrentValue(value);
221+
g.writeStartArray(value, len);
224222
serializeContents(value, g, provider);
225223
g.writeEndArray();
226224
}
@@ -274,8 +272,7 @@ public void serialize(char[] value, JsonGenerator g, SerializerProvider provider
274272
{
275273
// [JACKSON-289] allows serializing as 'sparse' char array too:
276274
if (provider.isEnabled(SerializationFeature.WRITE_CHAR_ARRAYS_AS_JSON_ARRAYS)) {
277-
g.writeStartArray(value.length);
278-
g.setCurrentValue(value);
275+
g.writeStartArray(value, value.length);
279276
_writeArrayContents(g, value);
280277
g.writeEndArray();
281278
} else {
@@ -389,7 +386,6 @@ public final void serialize(int[] value, JsonGenerator g, SerializerProvider pro
389386
return;
390387
}
391388
// 11-May-2016, tatu: As per [core#277] we have efficient `writeArray(...)` available
392-
g.setCurrentValue(value);
393389
g.writeArray(value, 0, value.length);
394390
}
395391

@@ -462,7 +458,6 @@ public final void serialize(long[] value, JsonGenerator g, SerializerProvider pr
462458
return;
463459
}
464460
// 11-May-2016, tatu: As per [core#277] we have efficient `writeArray(...)` available
465-
g.setCurrentValue(value);
466461
g.writeArray(value, 0, value.length);
467462
}
468463

@@ -539,8 +534,7 @@ public final void serialize(float[] value, JsonGenerator g, SerializerProvider p
539534
serializeContents(value, g, provider);
540535
return;
541536
}
542-
g.writeStartArray(len);
543-
g.setCurrentValue(value);
537+
g.writeStartArray(value, len);
544538
serializeContents(value, g, provider);
545539
g.writeEndArray();
546540
}
@@ -626,7 +620,6 @@ public final void serialize(double[] value, JsonGenerator g, SerializerProvider
626620
serializeContents(value, g, provider);
627621
return;
628622
}
629-
g.setCurrentValue(value);
630623
// 11-May-2016, tatu: As per [core#277] we have efficient `writeArray(...)` available
631624
g.writeArray(value, 0, value.length);
632625
}

src/main/java/com/fasterxml/jackson/databind/util/TokenBuffer.java

+24-9
Original file line numberDiff line numberDiff line change
@@ -679,8 +679,20 @@ public final void writeStartArray(int size) throws IOException
679679
_writeContext = _writeContext.createChildArrayContext();
680680
}
681681

682-
// // TODO: add 2 more `writeStartArray()` methods from 2.10 (in 2.11 or later)
683-
682+
@Override // since 2.10.1
683+
public void writeStartArray(Object forValue) throws IOException {
684+
_writeContext.writeValue();
685+
_appendStartMarker(JsonToken.START_ARRAY);
686+
_writeContext = _writeContext.createChildArrayContext();
687+
}
688+
689+
@Override // since 2.10.1
690+
public void writeStartArray(Object forValue, int size) throws IOException {
691+
_writeContext.writeValue();
692+
_appendStartMarker(JsonToken.START_ARRAY);
693+
_writeContext = _writeContext.createChildArrayContext(forValue);
694+
}
695+
684696
@Override
685697
public final void writeEndArray() throws IOException
686698
{
@@ -705,16 +717,19 @@ public void writeStartObject(Object forValue) throws IOException
705717
{
706718
_writeContext.writeValue();
707719
_appendStartMarker(JsonToken.START_OBJECT);
708-
// 15-Aug-2019, tatu: Matching method only added in 2.10, don't yet call
709-
JsonWriteContext ctxt = _writeContext.createChildObjectContext();
720+
JsonWriteContext ctxt = _writeContext.createChildObjectContext(forValue);
721+
_writeContext = ctxt;
722+
}
723+
724+
@Override // since 2.10.1
725+
public void writeStartObject(Object forValue, int size) throws IOException
726+
{
727+
_writeContext.writeValue();
728+
_appendStartMarker(JsonToken.START_OBJECT);
729+
JsonWriteContext ctxt = _writeContext.createChildObjectContext(forValue);
710730
_writeContext = ctxt;
711-
if (forValue != null) {
712-
ctxt.setCurrentValue(forValue);
713-
}
714731
}
715732

716-
// // TODO: add 1 more `writeStartObject()` methods from 2.10 (in 2.11 or later)
717-
718733
@Override
719734
public final void writeEndObject() throws IOException
720735
{

0 commit comments

Comments
 (0)