Skip to content

Commit c5b808b

Browse files
committed
More work on trying to call JsonParser.nextTextValue() for String-valued JSON arrays, to help with XML processing
1 parent 8c3cfb8 commit c5b808b

File tree

3 files changed

+44
-36
lines changed

3 files changed

+44
-36
lines changed

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

Lines changed: 13 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -52,8 +52,7 @@ public static JsonDeserializer<?> forType(Class<?> rawType)
5252

5353
@Override
5454
public Object deserializeWithType(JsonParser jp, DeserializationContext ctxt,
55-
TypeDeserializer typeDeserializer)
56-
throws IOException, JsonProcessingException
55+
TypeDeserializer typeDeserializer) throws IOException
5756
{
5857
/* Should there be separate handling for base64 stuff?
5958
* for now this should be enough:
@@ -76,8 +75,7 @@ final static class CharDeser
7675
public CharDeser() { super(char[].class); }
7776

7877
@Override
79-
public char[] deserialize(JsonParser jp, DeserializationContext ctxt)
80-
throws IOException, JsonProcessingException
78+
public char[] deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException
8179
{
8280
/* Won't take arrays, must get a String (could also
8381
* convert other tokens to Strings... but let's not bother
@@ -170,8 +168,7 @@ public boolean[] deserialize(JsonParser jp, DeserializationContext ctxt)
170168
return builder.completeAndClearBuffer(chunk, ix);
171169
}
172170

173-
private final boolean[] handleNonArray(JsonParser jp, DeserializationContext ctxt)
174-
throws IOException, JsonProcessingException
171+
private final boolean[] handleNonArray(JsonParser jp, DeserializationContext ctxt) throws IOException
175172
{
176173
// [JACKSON-620] Empty String can become null...
177174
if ((jp.getCurrentToken() == JsonToken.VALUE_STRING)
@@ -200,8 +197,7 @@ final static class ByteDeser
200197
public ByteDeser() { super(byte[].class); }
201198

202199
@Override
203-
public byte[] deserialize(JsonParser jp, DeserializationContext ctxt)
204-
throws IOException, JsonProcessingException
200+
public byte[] deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException
205201
{
206202
JsonToken t = jp.getCurrentToken();
207203

@@ -250,8 +246,7 @@ public byte[] deserialize(JsonParser jp, DeserializationContext ctxt)
250246
return builder.completeAndClearBuffer(chunk, ix);
251247
}
252248

253-
private final byte[] handleNonArray(JsonParser jp, DeserializationContext ctxt)
254-
throws IOException, JsonProcessingException
249+
private final byte[] handleNonArray(JsonParser jp, DeserializationContext ctxt) throws IOException
255250
{
256251
// [JACKSON-620] Empty String can become null...
257252
if ((jp.getCurrentToken() == JsonToken.VALUE_STRING)
@@ -288,8 +283,7 @@ final static class ShortDeser
288283
public ShortDeser() { super(short[].class); }
289284

290285
@Override
291-
public short[] deserialize(JsonParser jp, DeserializationContext ctxt)
292-
throws IOException, JsonProcessingException
286+
public short[] deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException
293287
{
294288
if (!jp.isExpectedStartArrayToken()) {
295289
return handleNonArray(jp, ctxt);
@@ -313,8 +307,7 @@ public short[] deserialize(JsonParser jp, DeserializationContext ctxt)
313307
return builder.completeAndClearBuffer(chunk, ix);
314308
}
315309

316-
private final short[] handleNonArray(JsonParser jp, DeserializationContext ctxt)
317-
throws IOException, JsonProcessingException
310+
private final short[] handleNonArray(JsonParser jp, DeserializationContext ctxt) throws IOException
318311
{
319312
// [JACKSON-620] Empty String can become null...
320313
if ((jp.getCurrentToken() == JsonToken.VALUE_STRING)
@@ -341,8 +334,7 @@ final static class IntDeser
341334
public IntDeser() { super(int[].class); }
342335

343336
@Override
344-
public int[] deserialize(JsonParser jp, DeserializationContext ctxt)
345-
throws IOException, JsonProcessingException
337+
public int[] deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException
346338
{
347339
if (!jp.isExpectedStartArrayToken()) {
348340
return handleNonArray(jp, ctxt);
@@ -367,8 +359,7 @@ public int[] deserialize(JsonParser jp, DeserializationContext ctxt)
367359
return builder.completeAndClearBuffer(chunk, ix);
368360
}
369361

370-
private final int[] handleNonArray(JsonParser jp, DeserializationContext ctxt)
371-
throws IOException, JsonProcessingException
362+
private final int[] handleNonArray(JsonParser jp, DeserializationContext ctxt) throws IOException
372363
{
373364
// [JACKSON-620] Empty String can become null...
374365
if ((jp.getCurrentToken() == JsonToken.VALUE_STRING)
@@ -395,8 +386,7 @@ final static class LongDeser
395386
public LongDeser() { super(long[].class); }
396387

397388
@Override
398-
public long[] deserialize(JsonParser jp, DeserializationContext ctxt)
399-
throws IOException, JsonProcessingException
389+
public long[] deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException
400390
{
401391
if (!jp.isExpectedStartArrayToken()) {
402392
return handleNonArray(jp, ctxt);
@@ -420,8 +410,7 @@ public long[] deserialize(JsonParser jp, DeserializationContext ctxt)
420410
return builder.completeAndClearBuffer(chunk, ix);
421411
}
422412

423-
private final long[] handleNonArray(JsonParser jp, DeserializationContext ctxt)
424-
throws IOException, JsonProcessingException
413+
private final long[] handleNonArray(JsonParser jp, DeserializationContext ctxt) throws IOException
425414
{
426415
// [JACKSON-620] Empty String can become null...
427416
if ((jp.getCurrentToken() == JsonToken.VALUE_STRING)
@@ -498,8 +487,7 @@ final static class DoubleDeser
498487
public DoubleDeser() { super(double[].class); }
499488

500489
@Override
501-
public double[] deserialize(JsonParser jp, DeserializationContext ctxt)
502-
throws IOException, JsonProcessingException
490+
public double[] deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException
503491
{
504492
if (!jp.isExpectedStartArrayToken()) {
505493
return handleNonArray(jp, ctxt);
@@ -523,8 +511,7 @@ public double[] deserialize(JsonParser jp, DeserializationContext ctxt)
523511
return builder.completeAndClearBuffer(chunk, ix);
524512
}
525513

526-
private final double[] handleNonArray(JsonParser jp, DeserializationContext ctxt)
527-
throws IOException, JsonProcessingException
514+
private final double[] handleNonArray(JsonParser jp, DeserializationContext ctxt) throws IOException
528515
{
529516
// [JACKSON-620] Empty String can become null...
530517
if ((jp.getCurrentToken() == JsonToken.VALUE_STRING)

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

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -91,12 +91,25 @@ protected final String[] _deserializeCustom(JsonParser jp, DeserializationContex
9191
final JsonDeserializer<String> deser = _elementDeserializer;
9292

9393
int ix = 0;
94-
JsonToken t;
9594

9695
try {
97-
while ((t = jp.nextToken()) != JsonToken.END_ARRAY) {
98-
// Ok: no need to convert Strings, but must recognize nulls
99-
String value = (t == JsonToken.VALUE_NULL) ? deser.getNullValue() : deser.deserialize(jp, ctxt);
96+
while (true) {
97+
/* 30-Dec-2014, tatu: This may look odd, but let's actually call method
98+
* that suggest we are expecting a String; this helps with some formats,
99+
* notably XML. Note, however, that while we can get String, we can't
100+
* assume that's what we use due to custom deserializer
101+
*/
102+
String value;
103+
if (jp.nextTextValue() == null) {
104+
JsonToken t = jp.getCurrentToken();
105+
if (t == JsonToken.END_ARRAY) {
106+
break;
107+
}
108+
// Ok: no need to convert Strings, but must recognize nulls
109+
value = (t == JsonToken.VALUE_NULL) ? deser.getNullValue() : deser.deserialize(jp, ctxt);
110+
} else {
111+
value = deser.deserialize(jp, ctxt);
112+
}
100113
if (ix >= chunk.length) {
101114
chunk = buffer.appendCompletedChunk(chunk);
102115
ix = 0;

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

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -199,12 +199,20 @@ public Collection<String> deserialize(JsonParser jp, DeserializationContext ctxt
199199
private Collection<String> deserializeUsingCustom(JsonParser jp, DeserializationContext ctxt,
200200
Collection<String> result, final JsonDeserializer<String> deser) throws IOException
201201
{
202-
JsonToken t;
203-
while ((t = jp.nextToken()) != JsonToken.END_ARRAY) {
202+
while (true) {
203+
/* 30-Dec-2014, tatu: This may look odd, but let's actually call method
204+
* that suggest we are expecting a String; this helps with some formats,
205+
* notably XML. Note, however, that while we can get String, we can't
206+
* assume that's what we use due to custom deserializer
207+
*/
204208
String value;
205-
206-
if (t == JsonToken.VALUE_NULL) {
207-
value = deser.getNullValue();
209+
if (jp.nextTextValue() == null) {
210+
JsonToken t = jp.getCurrentToken();
211+
if (t == JsonToken.END_ARRAY) {
212+
break;
213+
}
214+
// Ok: no need to convert Strings, but must recognize nulls
215+
value = (t == JsonToken.VALUE_NULL) ? deser.getNullValue() : deser.deserialize(jp, ctxt);
208216
} else {
209217
value = deser.deserialize(jp, ctxt);
210218
}
@@ -220,7 +228,7 @@ public Object deserializeWithType(JsonParser jp, DeserializationContext ctxt, Ty
220228
}
221229

222230
/**
223-
* Helper method called when current token is no START_ARRAY. Will either
231+
* Helper method called when current token is not START_ARRAY. Will either
224232
* throw an exception, or try to handle value as if member of implicit
225233
* array, depending on configuration.
226234
*/

0 commit comments

Comments
 (0)