Skip to content

Commit 8107723

Browse files
committed
Fix #222
1 parent 3b340f3 commit 8107723

File tree

3 files changed

+48
-5
lines changed

3 files changed

+48
-5
lines changed

csv/src/main/java/com/fasterxml/jackson/dataformat/csv/CsvParser.java

+20-4
Original file line numberDiff line numberDiff line change
@@ -298,6 +298,11 @@ private Feature(boolean defaultState) {
298298
*/
299299
protected int _columnCount = 0;
300300

301+
/**
302+
* @since 2.12
303+
*/
304+
protected boolean _cfgEmptyStringAsNull;
305+
301306
/*
302307
/**********************************************************************
303308
/* State
@@ -395,6 +400,7 @@ public CsvParser(CsvIOContext ctxt, int stdFeatures, int csvFeatures,
395400
_parsingContext = JsonReadContext.createRootContext(dups);
396401
_reader = new CsvDecoder(this, ctxt, reader, _schema, _textBuffer,
397402
stdFeatures, csvFeatures);
403+
_cfgEmptyStringAsNull = CsvParser.Feature.EMPTY_STRING_AS_NULL.enabledIn(csvFeatures);
398404
}
399405

400406
/*
@@ -495,6 +501,7 @@ public JsonParser overrideFormatFeatures(int values, int mask) {
495501
if (oldF != newF) {
496502
_formatFeatures = newF;
497503
_reader.overrideFormatFeatures(newF);
504+
_cfgEmptyStringAsNull = CsvParser.Feature.EMPTY_STRING_AS_NULL.enabledIn(_formatFeatures);
498505
}
499506
return this;
500507
}
@@ -512,6 +519,7 @@ public JsonParser overrideFormatFeatures(int values, int mask) {
512519
public JsonParser enable(Feature f)
513520
{
514521
_formatFeatures |= f.getMask();
522+
_cfgEmptyStringAsNull = CsvParser.Feature.EMPTY_STRING_AS_NULL.enabledIn(_formatFeatures);
515523
return this;
516524
}
517525

@@ -522,6 +530,7 @@ public JsonParser enable(Feature f)
522530
public JsonParser disable(Feature f)
523531
{
524532
_formatFeatures &= ~f.getMask();
533+
_cfgEmptyStringAsNull = CsvParser.Feature.EMPTY_STRING_AS_NULL.enabledIn(_formatFeatures);
525534
return this;
526535
}
527536

@@ -944,6 +953,9 @@ protected JsonToken _handleNamedValue() throws IOException
944953
return JsonToken.VALUE_NULL;
945954
}
946955
}
956+
if (_cfgEmptyStringAsNull && "".equals(_currentValue)) {
957+
return JsonToken.VALUE_NULL;
958+
}
947959
return JsonToken.VALUE_STRING;
948960
}
949961

@@ -968,6 +980,9 @@ protected JsonToken _handleUnnamedValue() throws IOException
968980
return JsonToken.VALUE_NULL;
969981
}
970982
}
983+
if (_cfgEmptyStringAsNull && "".equals(_currentValue)) {
984+
return JsonToken.VALUE_NULL;
985+
}
971986
return JsonToken.VALUE_STRING;
972987
}
973988

@@ -1010,6 +1025,9 @@ protected JsonToken _handleArrayValue() throws IOException
10101025
return JsonToken.VALUE_NULL;
10111026
}
10121027
}
1028+
if (_cfgEmptyStringAsNull && "".equals(_currentValue)) {
1029+
return JsonToken.VALUE_NULL;
1030+
}
10131031
return JsonToken.VALUE_STRING;
10141032
}
10151033

@@ -1055,7 +1073,6 @@ protected JsonToken _handleExtraColumn(String value) throws IOException
10551073
if (next == null) { // should end of record or input
10561074
return _handleObjectRowEnd();
10571075
}
1058-
System.err.println("... yet we did NOT skip");
10591076
}
10601077
}
10611078
// 21-May-2015, tatu: Need to enter recovery mode, to skip remainder of the line
@@ -1167,9 +1184,8 @@ public String getText() throws IOException {
11671184
if (_currToken == JsonToken.FIELD_NAME) {
11681185
return _currentName;
11691186
}
1170-
if (_currentValue.equals("")) {
1171-
return isEnabled(CsvParser.Feature.EMPTY_STRING_AS_NULL) ? null : _currentValue;
1172-
}
1187+
// 08-Sep-2020, tatu: Used to check for empty String wrt EMPTY_STRING_AS_NULL
1188+
// here, but now demoted to actual "nextToken()" handling
11731189
return _currentValue;
11741190
}
11751191

csv/src/test/java/com/fasterxml/jackson/dataformat/csv/deser/EmptyStringAsNullTest.java

+25-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package com.fasterxml.jackson.dataformat.csv.deser;
22

33
import com.fasterxml.jackson.annotation.JsonPropertyOrder;
4-
4+
import com.fasterxml.jackson.databind.MappingIterator;
55
import com.fasterxml.jackson.databind.ObjectReader;
66
import com.fasterxml.jackson.dataformat.csv.CsvMapper;
77
import com.fasterxml.jackson.dataformat.csv.CsvParser;
@@ -69,4 +69,28 @@ public void testSimpleParseEmptyStringAsNull() throws IOException {
6969
assertNull("The column that contains an empty String should be deserialized as null ", actualTestUser.middleName);
7070
assertEquals(expectedTestUser.lastName, actualTestUser.lastName);
7171
}
72+
73+
// [dataformats-text#222]
74+
public void testEmptyStringAsNullNonPojo() throws Exception
75+
{
76+
String csv = "Grace,,Hopper";
77+
78+
ObjectReader r = MAPPER.reader()
79+
.with(CsvParser.Feature.EMPTY_STRING_AS_NULL)
80+
.with(CsvParser.Feature.WRAP_AS_ARRAY);
81+
82+
try (MappingIterator<Object[]> it1 = r.forType(Object[].class).readValues(csv)) {
83+
Object[] array1 = it1.next();
84+
assertEquals(3, array1.length);
85+
assertEquals("Grace", array1[0]);
86+
assertEquals("Hopper", array1[2]);
87+
assertNull(array1[1]);
88+
}
89+
try (MappingIterator<String[]> it2 = r.forType(String[].class).readValues(csv)) {
90+
String[] array2 = it2.next();
91+
assertEquals("Grace", array2[0]);
92+
assertEquals("Hopper", array2[2]);
93+
assertNull(array2[1]);
94+
}
95+
}
7296
}

release-notes/VERSION-2.x

+3
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,9 @@ Modules:
1212

1313
#199: (csv) Empty Lists can only be String-typed in CSV
1414
(reported by Simon L)
15+
#222: (csv) `JsonParser.Feature.EMPTY_STRING_AS_NULL` does not work when
16+
text is parsed as `String[]`
17+
(reported by wkwkhautbois@github)
1518
- Add Gradle Module Metadata (https://blog.gradle.org/alignment-with-gradle-module-metadata)
1619

1720
2.11.2 (02-Aug-2020)

0 commit comments

Comments
 (0)