Skip to content

Commit d684fb3

Browse files
authored
Merge pull request #4 from kmlvision/bugfix_issue_3_deserialize_strings
fix #3
2 parents b4e4874 + 9187e62 commit d684fb3

File tree

2 files changed

+46
-7
lines changed

2 files changed

+46
-7
lines changed

src/main/java/org/openapitools/jackson/nullable/JsonNullableDeserializer.java

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,22 +10,27 @@
1010
import com.fasterxml.jackson.databind.deser.ValueInstantiator;
1111
import com.fasterxml.jackson.databind.deser.std.ReferenceTypeDeserializer;
1212
import com.fasterxml.jackson.databind.jsontype.TypeDeserializer;
13+
import com.fasterxml.jackson.databind.type.ReferenceType;
1314

1415
import java.io.IOException;
1516

1617
public class JsonNullableDeserializer extends ReferenceTypeDeserializer<JsonNullable<Object>> {
1718

1819
private static final long serialVersionUID = 1L;
1920

21+
private boolean isStringDeserializer = false;
22+
2023
/*
2124
/**********************************************************
2225
/* Life-cycle
2326
/**********************************************************
2427
*/
2528
public JsonNullableDeserializer(JavaType fullType, ValueInstantiator inst,
26-
TypeDeserializer typeDeser, JsonDeserializer<?> deser)
27-
{
29+
TypeDeserializer typeDeser, JsonDeserializer<?> deser) {
2830
super(fullType, inst, typeDeser, deser);
31+
if (fullType instanceof ReferenceType && ((ReferenceType) fullType).getReferencedType() != null) {
32+
this.isStringDeserializer = ((ReferenceType) fullType).getReferencedType().isTypeOrSubTypeOf(String.class);
33+
}
2934
}
3035

3136
/*
@@ -37,7 +42,7 @@ public JsonNullableDeserializer(JavaType fullType, ValueInstantiator inst,
3742
@Override
3843
public JsonNullable<Object> deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
3944
JsonToken t = p.getCurrentToken();
40-
if (t == JsonToken.VALUE_STRING && !_fullType.isTypeOrSubTypeOf(String.class)) {
45+
if (t == JsonToken.VALUE_STRING && !isStringDeserializer) {
4146
String str = p.getText().trim();
4247
if (str.isEmpty()) {
4348
return JsonNullable.undefined();

src/test/java/org/openapitools/jackson/nullable/JsonNullableSimpleTest.java

Lines changed: 38 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
import java.util.Arrays;
1212
import java.util.List;
1313

14-
import static org.junit.Assert.*;
14+
import static org.junit.Assert.assertEquals;
1515

1616
public final class JsonNullableSimpleTest {
1717

@@ -69,22 +69,44 @@ public void serializeCollection() throws JsonProcessingException {
6969
}
7070

7171
@Test
72-
public void deserialize() throws IOException {
72+
public void deserializeStringMembers() throws IOException {
7373
testReadPetName(JsonNullable.of("Rex"), "{\"name\":\"Rex\"}");
7474
testReadPetName(JsonNullable.<String>of(null), "{\"name\":null}");
75+
testReadPetName(JsonNullable.<String>of(""), "{\"name\":\"\"}");
76+
testReadPetName(JsonNullable.<String>of(" "), "{\"name\":\" \"}");
7577
testReadPetName(JsonNullable.<String>undefined(), "{}");
7678
}
7779

7880
@Test
79-
public void deserializeNonBeanProperty() throws IOException {
81+
public void deserializeNonStringMembers() throws IOException {
82+
testReadPetAge(JsonNullable.of(Integer.valueOf(15)), "{\"age\":\"15\"}");
83+
testReadPetAge(JsonNullable.<Integer>of(null), "{\"age\":null}");
84+
testReadPetAge(JsonNullable.<Integer>undefined(), "{\"age\":\"\"}");
85+
testReadPetAge(JsonNullable.<Integer>undefined(), "{\"age\":\" \"}");
86+
testReadPetAge(JsonNullable.<Integer>undefined(), "{}");
87+
}
88+
89+
@Test
90+
public void deserializeStringNonBeanMembers() throws IOException {
91+
assertEquals(JsonNullable.of(null), mapper.readValue("null", new TypeReference<JsonNullable<String>>() {}));
92+
assertEquals(JsonNullable.of("42"), mapper.readValue("\"42\"", new TypeReference<JsonNullable<String>>() {}));
93+
assertEquals(JsonNullable.of(""), mapper.readValue("\"\"", new TypeReference<JsonNullable<String>>() {}));
94+
assertEquals(JsonNullable.of(" "), mapper.readValue("\" \"", new TypeReference<JsonNullable<String>>() {}));
95+
}
96+
97+
@Test
98+
public void deserializeNonStringNonBeanMembers() throws IOException {
8099
assertEquals(JsonNullable.of(null), mapper.readValue("\"null\"", new TypeReference<JsonNullable<Integer>>() {}));
81100
assertEquals(JsonNullable.of(42), mapper.readValue("\"42\"", new TypeReference<JsonNullable<Integer>>() {}));
82101
assertEquals(JsonNullable.undefined(), mapper.readValue("\"\"", new TypeReference<JsonNullable<Integer>>() {}));
102+
assertEquals(JsonNullable.undefined(), mapper.readValue("\" \"", new TypeReference<JsonNullable<Integer>>() {}));
83103
}
84104

85105
@Test
86106
public void deserializeCollection() throws IOException {
87-
List<JsonNullable<String>> values = mapper.readValue("[\"foo\", null]", new TypeReference<List<JsonNullable<String>>>() {});
107+
List<JsonNullable<String>> values = mapper.readValue("[\"foo\", null]",
108+
new TypeReference<List<JsonNullable<String>>>() {
109+
});
88110
assertEquals(2, values.size());
89111
assertEquals(JsonNullable.of("foo"), values.get(0));
90112
assertEquals(JsonNullable.of(null), values.get(1));
@@ -96,13 +118,25 @@ private void testReadPetName(JsonNullable<String> expected, String json) throws
96118
assertEquals(expected, name);
97119
}
98120

121+
private void testReadPetAge(JsonNullable<Integer> expected, String json) throws IOException {
122+
Pet pet = mapper.readValue(json, Pet.class);
123+
JsonNullable<Integer> age = pet.age;
124+
assertEquals(expected, age);
125+
}
126+
99127
private static class Pet {
100128

101129
public JsonNullable<String> name = JsonNullable.undefined();
130+
public JsonNullable<Integer> age = JsonNullable.undefined();
102131

103132
public Pet name(JsonNullable<String> name) {
104133
this.name = name;
105134
return this;
106135
}
136+
137+
public Pet age(JsonNullable<Integer> age) {
138+
this.age = age;
139+
return this;
140+
}
107141
}
108142
}

0 commit comments

Comments
 (0)